文章目录
前言
这篇文章来讲讲Spring的重要组成部分@Transactional注解是如何生效的
一、@Transactional的作用
写java的都知道,这个注解是用来给方法添加事务的,一般情况我们都是用在访问数据库的service的逻辑上。
二、@Transactional如何生效的
1.@EnableTransactionManagement
项目要使用@Transactional来管理事务,就必须要在Application类上添加@EnableTransactionManagement注解,来解析下该注解吧
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({
TransactionManagementConfigurationSelector.class})
public @interface EnableTransactionManagement {
boolean proxyTargetClass() default false;
AdviceMode mode() default AdviceMode.PROXY;
int order() default 2147483647;
}
太眼熟了啊喂,也有Import注解,那废话不多说,咱们来看看Import进来的类是个什么作用。
public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> {
public TransactionManagementConfigurationSelector() {
}
protected String[] selectImports(AdviceMode adviceMode) {
switch(adviceMode) {
// 默认情况下,adviceMode是PROXY,可以查看上面的注解源码
case PROXY:
return new String[]{
AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()};
case ASPECTJ:
return new String[]{
this.determineTransactionAspectClass()};
default:
return null;
}
}
private String determineTransactionAspectClass() {
return ClassUtils.isPresent("javax.transaction.Transactional", this.getClass().getClassLoader()) ? "org.springframework.transaction.aspectj.AspectJJtaTransactionManagementConfiguration" : "org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration";
}
}
至于selectImport的实现逻辑,可以参看我那篇讲解@EnableAutoConfiguration注解实现原理的文章。
简而言之:此处spring会把AutoProxyRegistrar和ProxyTransactionManagementConfiguration添加进容器,同时当成配置类解析一下。
2. AutoProxyRegistrar
public class AutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
private final Log logger = LogFactory.getLog(getClass());
/**
* 这个类会在configurationClassPostProcessor的postProcessBeanDefinitionRegistry
* 里面统一调用ImportBeanDefinitionRegistrar的registerBeanDefinitions时被调用
* 然后注册相应的BeanDefinition
*/
@Override
public void
Spring @Transactional 注解生效原理探析

本文深入探讨了Spring中@Transactional注解的工作机制。首先,启用事务管理需要在配置类上添加@EnableTransactionManagement。接着,AutoProxyRegistrar和ProxyTransactionManagementConfiguration被引入,通过AOP生成TransactionAdvisor。TransactionInterceptor作为通知,处理事务逻辑。pointCut在TransactionAttributeSourcePointcut中定义,用于判断方法是否需要事务管理。最后,@Transactional可以在方法、类甚至接口上声明,影响事务的生效范围。
最低0.47元/天 解锁文章
3708

被折叠的 条评论
为什么被折叠?



