SpringAop源码解析
2021-04-19 23:56:20 10 举报
SpringAop解析过程追踪
作者其他创作
大纲/内容
解析切面的方法
提取Aspect类中所有的Advice方法getAdvisors()
getAdvicesAndAdvisorsForBean()
解析切面
wrapIfNecessary()
postProcessAfterInitialization()
@Import(AspectJAutoProxyRegistrar.class)
AnnotationAwareAspectJAutoProxyCreator依赖关系
postProcessBeforeInstantiation()
创建代理对象,对目标方法进行增强
在配置类上,加上此注解,可以开启注解AOP
@EnableAspectJAutoProxy
SmartInstantiationAwareBeanPostProcessor
AbstractAdvisorAutoProxyCreator
AbstractAutoProxyCreator
否isInfrastructureClass()
AnnotationAwareAspectJAutoProxyCreator
创建动态代理
advisedBeans是否解析过
找到了Advisor【增强点】
给容器中注册一个名称为org.springframework.aop.config.internalAutoProxyCreator类型为AnnotationAwareAspectJAutoProxyCreator的组件
shouSkip()
第一步
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
InstantiationAwareBeanPostProcessor
找到候选的 advisor (通知,前置,后置等)findCandidateAdvisors()
1. 跟着@EnableAspectJAutoProxy的执行流程,可以发现最后注册了一个AnnotationAwareAspectJAutoProxyCreator 类型的BeanDefinition; 根据右图的 AnnotationAwareAspectJAutoProxyCreator 的继承关系,可以发现这样三个顶层接口:BeanPostProcessor,InstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor;追踪过SpringIOC的执行流程可以知道,在实例化的时候,Spring底层会有9个拓展点,其中就牵涉到了这三个接口!注意:AOP前面的解析会在实例化前完成,一般情况下,AOP动态代理创建是在初始化后,但是如果存在循环依赖问题的话,将会提前到实例化后创建!2. Spring AOP四种实现方式:1. 基于接口的配置--spring1.22. 纯POJO切面(XML)--spring2.03. @ASpectJ注解驱动的切面(注解)4. 注入式AspectJ切面 (其实与Spring并无多大的关系,这个就是使用AspectJ这个框架实现Aop编程,需要用到AspectJ的编译器)
createProxy()
否
AspectJAwareAdvisorAutoProxyCreator
注册bean定义的名称为:‘org.springframework.aop.config.internalAutoProxyCreator’
是否实现了Advisor,PointCut或者AopInfrastructureBean接口
Advisors的相关信息后封装为一个advisorsbuildAspectJAdvisors()
BeanPostProcessor
第二步
根据class 对象判断是不是切面isAspect()
0 条评论
下一页