在纯spring 框架中,想要使用事务,注解方式是在加载类加上注解
@EnableTransactionManagement,里面有个@Import,里面会帮我们注册一个类:BeanFactoryTransactionAttributeSourceAdvisor
所以进到aop 创建代理对象有这个代码
下面是代理的创建,在创建代理肯定要先找到这个代理要走哪些拦截器
所以进入这个方法,得到的是前面缓存好的
BeanFactoryTransactionAttributeSourceAdvisor
拿到之后后续会调用canApply 方法进行判断当前的Advisor是否能够应用,而对于事务来讲是这样的好,他会走canApply 然后走匹配器MethodMatcher,然后进到TransactionAttributeSourcePointcut,然后再到如下:
如果当前方法没有加@Transactional,那么返回null,那么回到创建代理,就不会有TransactionInterceptor 这个东西了,所以在真正代理方法调用也不会走TransactionInterceptor 的invoke 方法了
谈谈为什么是invoke
因为在spring aop 体系中,spring靠的是MethodInceptor 来做拦截,
而MethodInceptor 也实现了Advice 也是aop 的一个设计
cglib 如何走代理
在cglib 代理的类,会走callback[0],而它就是org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor#intercept
所以这里会去执行aop 的东西,包括事务TransactionInterceptor