Spring通过BeanPostProcessor帮我们实现代理对象的创建。这些代理对象的创建器有三类:
1、基于Bean名称在xml配置规则的自动代理创建器:BeanNameAutoProxyCretor
2、基于Advisor匹配机制的自动代理创建器:对容器所有的Advisor进行扫描,实现类为DefaultAdvisorAutoProxyCreator
3、基于Bean中的Aspect注解的自动代理创建器: AnnotationAwareAspectJAutoProxyCreator
其中第3种,基于Aspect注解创建代理的源码如下:
入口方法是在spring实例化bean的过程中调用后置处理器,循环遍历BeanPostProcessor,然后进入到AnnotationAwareAspectJAutoProxyCreator的postProcessAfterInitialization方法。代码如下:
然后在AbstractAutoProxyCreator类中通过wrapIfNecessary判断当前beanClass是否有切面相关的注解,有的话会获取beanClass下所有的Advisor,然后生成代理对象返回,并且保存到Spring容器中。
所以Aspect注解的代理对象是在AbstractAutoProxyCreator中创建的。