创建不同类型的Advice类
ReflectiveAspectJAdvisorFactory#getAdvisors收集@Advice注解的类的所有方法,然后AbstractAspectJAdvisorFactory#findAspectJAnnotationOnMethod再收集这个类的所有切面注解并且把属性封装成AspectJAnnotation对象.

然后ReflectiveAspectJAdvisorFactory#getAdvisor调用ReflectiveAspectJAdvisorFactory#getPointcut里面创建了一个PointCut类,并且给上面切面注解解析的切入点表达式设计进去,

最后ReflectiveAspectJAdvisorFactory#getAdvisor最下面实例化了一个InstantiationModelAwarePointcutAdvisorImpl类,给上面解析的注解对应的类,对应的方法,对应的参数,注解的方法都赋值到InstantiationModelAwarePointcutAdvisorImpl类.最后InstantiationModelAwarePointcutAdvisorImpl调用InstantiationModelAwarePointcutAdvisorImpl#instantiateAdvice创建Advice类(通过AspectJAnnotation类创建的),是根据不同的注解类型创建不同的Advice类,比如说@Before的,就创建AspectJMethodBeforeAdvice,如果你是@After就创建AspectJAfterAdvice类型的.


AbstractAdvisorAutoProxyCreator#findEligibleAdvisors 方法给所有的advisor类(切面)进行循环遍历,过滤器符合这个类的advisor,比如说UserController就需要A的advisor类和B的advisor类,TestController需要C的advisor类和D的advisor类,,就需要给这些东西过滤一下,说白了了就是判断你这个类是否在advisor的PointCut匹配表达式范围内,如果这个类在范围内,就绝对需要生成代理对象(生成的代理类根据配置信息是jdk动态代理或是cglib动态代理). 生成的代理对象里面有匹配代理对象的Advisor对象数组.



1.什么时候这个类需要生成代理对象


在bean实例化以后,有一个BeanPostProcessor(AbstractAutoProxyCreator),会判断这个类是不是有@Advice类和是否有那些切面注解,如果有的话,这个类就会生成代理类,最后装入到Spring容器的就是这个类的代理对象.


AspectJAnnotation

这个类是封装了切面注解的基本信息,比如说@Before注解的基本信息.


Advice

收集@Advice注解的类的方法,判断这个类是否生成代理对象 - 图1

org.springframework.aop.framework.adapter.DefaultAdvisorAdapterRegistry#DefaultAdvisorAdapterRegistry构造方法会注册以下三个适配器:

1.org.springframework.aop.framework.adapter.MethodBeforeAdviceAdapter 是处理AspectJMethodBeforeAdvice类型的Advice,

2.org.springframework.aop.framework.adapter.AfterReturningAdviceAdapter是处理AspectJAfterReturningAdvice
和AspectJAfterThrowingAdvice

3.org.springframework.aop.framework.adapter.ThrowsAdviceAdapter


Advisor对象

Advisor包含Advice和Pointcut ,这两个是缺一不可的,不管是事务切面还是缓存切面,都会有这两个元素.

一个切面方法对应Advisor类,比如说一个@Before加上+PointCut表达式 , 就是一个Advisor类.