1、@EnableAspectJAutoProxy
导入了AnnotationAwareAspectJAutoProxyCreator组件
2、分析AnnotationAwareAspectJAutoProxyCreator继承关系
AnnotationAwareAspectJAutoProxyCreator 继承关系发现了他具有BeanPostProcessor接口特性和InstantiationAwareBeanPostProcessor的特性。
3、在第一个bean被创建时缓存切面(InstantiationAwareBeanPostProcessor)
根据bean的生命周期,在doCreatBean里面的resolveBeforelnstantiation方法,会触发
InstantiationAwareBeanPostProcessor的的postProcessBeforeInstantiation方法,在里面会找到所有@Aspectj的切面找到,并且缓存起来。
postProcessBeforeInstantiation
shouldSkip()
findCandidateAdvisors();
findCandidateAdvisors();找现成的增强器(事务相关)
buildAspectJAdvisors;//找@Aspectj相关的,生成Advisors增强器
this.advisorsCache.put(beanName, classAdvisors);//缓存起来
4、创建代理对象(BeanPostProcessor )
创建对象时,在属性赋值完成后,初始化方法里,触发BeanPostProcessor .after方法,在此方法中,根据方法匹配去找自己的切面(增强器),然后把增强器和被切的对象创成-个代理对象。
postProcessAfterInitialization
wrapIfNecessary //不需要创建代理对象,就直接返回bean
getAdvicesAndAdvisorsForBean//需要创建代理对象
findEligibleAdvisors//获取增强器
findCandidateAdvisors();//找到候选的,可从缓存中取,3步骤已放
findAdvisorsThatCanApply//从候选的中找到能用的
createProxy()//创建代理对象
ProxyFactory proxy = new ProxyFactory();
5、调用过程
可以通过order指定调用顺序,不加默认是最后调用
getInterceptorsAndDynamicInterceptionAdvice 获取调用链
采用递归及责任链模式,依次调用
异常通知(放在cacth中,异常时会走)
-> 返回通知(抛异常就不走了)
->后置通知(finily中,总是执行)
->前置通知