Spring源码解读:@Transactional原理(1)

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


前言

这篇文章来讲讲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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值