@EnableTransactionManagement开启事务管理时,@EnableAspectJAutoProxy必须开启吗

前两天被这个问题纠结了好久

在这里插入图片描述

在这里插入图片描述

如上,没有加@EnableAspectJAutoProxy注解的情况下,也是能正常完成事务管理的,并没有影响。网上也找不到合理的解释,都是说必须开启aop。
后来看源码发现了区别:
@EnableTransactionManagement和@EnableAspectJAutoProxy在Spring进行初始化的时候,分别会在BeanDefinitionMap中注册不同的BeanPostProcessor。

@EnableTransactionManagement注册的是InfrastructureAdvisorAutoProxyCreator,而@EnableAspectJAutoProxy注册的是AnnotationAwareAspectJAutoProxyCreator。

关键在AopConfigUtils.java中的判断:
在这里插入图片描述

	@Nullable
	private static BeanDefinition registerOrEscalateApcAsRequired(
			Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) {

		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");

		if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {
			BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
			if (!cls.getName().equals(apcDefinition.getBeanClassName())) {
				int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName());
				int requiredPriority = findPriorityForClass(cls);
				if (currentPriority < requiredPriority) {
					apcDefinition.setBeanClassName(cls.getName());
				}
			}
			return null;
		}

		RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
		beanDefinition.setSource(source);
		beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
		beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
		return beanDefinition;
	}

当@EnableTransactionManagement开启事务管理时,会在一个新的BeanDefinition,beanName为org.springframework.aop.config.internalAutoProxyCreator,Class为org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator。
当加上@EnableAspectJAutoProxy时,会判断这个BeanDefinition是否存在,然后判断初始化进去的三个BeanPostProcessor的优先级,然后进行替换,如下:

在这里插入图片描述
所以如果开启支持AspectJ注解@EnableAspectJAutoProxy,到了最后就会剩下AnnotationAwareAspectJAutoProxyCreator。

结论就是,对结果没影响,只是因为使用的BeanPostProcessor不同,优先级越高,功能越强大。
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值