注解aop源码分析(2)
2020-02-26 本文已影响0人
快点给我想个名
上次我们说到AnnotationAwareAspectJAutoProxyCreator
类。那我们这次就简单看一下这个类。
继承结构
AnnotationAwareAspectJAutoProxyCreator继承结构图从图中可以看到,首先其实现了
BeanFactoryAware
接口,通过该可以获得beanFactory
工厂。其次实现了BeanPostProcessor
接口,这个接口可以在bean调用init
方法前后对bean进行一些处理。所以我们的AnnotationAwareAspectJAutoProxyCreator
类目前已经具备了这两个功能。接下来我们关注这两点就可以了。
-
beanFactory
的能力
我们从AnnotationAwareAspectJAutoProxyCreator
类的继续关系中查找实现了 beanFactory
接口的方法。发现在AbstractAutoProxyCreator
类中。
@Override
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
而AbstractAutoProxyCreator
类又被其继承类AbstractAdvisorAutoProxyCreator
重写了 beanFactory
的接口
@Override
public void setBeanFactory(BeanFactory beanFactory) {
super.setBeanFactory(beanFactory);
if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
throw new IllegalArgumentException(
"AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);
}
initBeanFactory((ConfigurableListableBeanFactory) beanFactory);
}
我们看到在上面的代码中调用了super.setBeanFactory(beanFactory);
方法,也就是AbstractAutoProxyCreator
类中的方法。之后又调用了initBeanFactory((ConfigurableListableBeanFactory) beanFactory);
方法,而这个方法又被其继承类AnnotationAwareAspectJAutoProxyCreator
重写
@Override
protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
super.initBeanFactory(beanFactory);
if (this.aspectJAdvisorFactory == null) {
this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);
}
this.aspectJAdvisorsBuilder =
new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
}
在上面的代码中创建了两个类AspectJAdvisorFactory
BeanFactoryAspectJAdvisorsBuilder
。具体做什么的,我们先不用管,但是估计和aop有关。
-
BeanPostProcessor
的能力
这个接口中的方法在AbstractAutoProxyCreator
类中被实现的。
现在我们知道如果项目启动,可以根据该@EnableAspectJAutoProxy
注解为容器中加入一个类了,那这个类具体是怎么注册初始化的呢?下一篇继续分析