AOP
2022-11-16 19:27:00 4 举报
AOP
作者其他创作
大纲/内容
AnnotationAwareAspectJAutoProxyCreator实现了InstantiationAwareBeanPostProcessor,会在Bean实例化之前的进行调用后置处理器
执行完后置处理器,所有的advisor都被放在一个集合里面,会在Bean初始化后的后置处理器中对每一个Bean进行判断(通过切点表达式),是否要进行动态代理
排序方式:AfterThrowingAfterReturnAfterBefore
shoundSkip()
dobegin(),获得一个Connection对象来开启事务,后面事物的挂起也是利用它来完成的
调用
findTransactionAttribute(Method method)
动态代理
createTransactionIfNeccesary()
通过事物的传播行为去判断是否要开启
AbstractAutoProxyCreator.postProcessAfterinitialization()
通过ImportBeanDifinitionRegistry的方式将AnnotationAwareAspectJAutoProxyCreator注册到BeanDifinition中
AbstractAutoProxyCreator.postProcessBeforeInstantiation()
AnnotationAwareAspectJAutoProxyCreator.findCadidateAdvisors(
这里会通过一个早期对象的Map缓存来判断对象是不是已经发生了代理了,因为存在循环依赖的时候,代理会发生在初始化后的后置处理器中
ReflectiveMethodInterceptor.procced()
两种advisor最大的不同在于通知advice,动态代理这边的通知一般是自定义的,而事务管理这边是spring写好的
这边advisor的集合后面会进行排序,排序方式和代码的的实现有一定的逻辑关系,它的调用判断是通过责任链的方式来实现的
调用annotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()
判断是否实现了advisor类,把实现的类加入集合中
method对象是接口方法
返回一个TransactionInfo对象
执行的第一个是@EnableTransactionManagement中通过ImportSeletor进行注入的ProxyTransactionManagementConfiguration.advice属性,spring直接new了一个Interceptor放进去
接口方法-> 接口类上->实现类方法 ->实现类上是否有@Transactional
判断方法上是否有注解@Transactional然后判断实现类上是否有@Transactional
buildAspectJAdvisors()对所有的Bean做判断,解析@AspectJ,将符合条件的Bean组装成advisor(通知 advice + 切点 pointCut)
@EnableAspectJAutoProxy
事务管理
method对象是实现类的方法
try{责任链的递归调用}catch(){rollback}commit()
createProxy()
事务advisor判断是否命中,是通过注解@Transactional来判断这个类是否符合
首先会去调用父类AbstractAdvisorAutoProxyCreator.findCandidateAdvisors()
0 条评论
下一页