作用:处理各种与AOP相关操作的核心类,也就是说关于AOP的操作,几乎都是靠这个类完成呢,由于该类的顶层父类是BeanPostProcessor,所以调用实在registerBeanPostProcessors方法的时候触发AOP相关操作
时机:那么什么时候实例化这个类的呢?
当我们的任意一个类上(不一定是启动类)配有 @EnableAspectJAutoProxy 注解的时候,那么spring会通过AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary方法将AnnotationAwareAspectJAutoProxyCreator封装成BeanDefinition并且注册到BeanDefinitionRegistry(就是DefaultListableBeanFactory实例)
那么具体的问题又来了,spring是何时判断类上是否标记有 @EnableAspectJAutoProxy 注解呢?是在处理ConfigurationClassPostProcessor类的processConfigBeanDefinitions方法的时候,该方法签名如下
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry)
该方法中有这样一段代码
// Read the model and create bean definitions based on its content
if (this.reader == null) {
this.reader = new ConfigurationClassBeanDefinitionReader(
registry, this.sourceExtractor, this.resourceLoader, this.environment,
this.importBeanNameGenerator, parser.getImportRegistry());
}
this.reader.loadBeanDefinitions(configClasses);
就是这个loadBeanDefinitions方法,来创建AnnotationAwareAspectJAutoProxyCreator实例的,具体请参考我的另一篇文章Spring-ConfigurationClassBeanDefinitionReader
方法:wrapIfNecessary(在其父类AbstractAutoProxyCreator中)
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey)
判断当前bean是否需要被代理,如果需要,则返回代理类