Spring及Spring boot 第四章-第二节 Spring声明式事务管理 解析@Transactional
这个过程可以和@Aspect 实现的AOP来进行对比
(1) 获取Advisor——BeanFactoryTransactionAttributeSourceAdvisor
@Transactional和@Aspect获取Advisor的不同之处在于它的Advisor一开始便是以Bean的形式存在,不需要通过解析@Aspect注解来将方法转化为Advisor
(2)判断Advisor是否应用于该Bean
在Spring声明式事务管理解析@Transactional注解的过程中会将它的信息转化为TransactionAttribute对象,
首先进行判断,BeanFactoryTransactionAttributeSourceAdvisor不是IntroductionAdvisor类型然后开始判断canApply,这是重点
IntroductionAdvisor的意义是实现AOP引入功能,和切点功能还不太一样。这里BeanFactoryTransactionAttributeSourceAdvisor当然是作为PointCutAdvisor
参考链接跟着小马哥学系列之 Spring AOP
AopUtils#canApply——非常重要的场景
它做了两件事
1. 判断这个目标类上有没有@Transactional注解,这样就可以知道事务相关的Advisor(BeanFactoryTransactionAttributeSourceAdvisor)能不能应用于该Bean,方便做之后的处理
2. 如果有,之后就进行真正的@Transactional注解解析,这里是非常重要的点(获取TransactionDefinition)
public static boolean canApply(Pointcut pc, Class<?> targetClass, boolean hasIntroductions) {
Assert.notNull(pc, "Pointcut must not be null");
if (!pc.getClassFilter().matches(targetClass))