注解aop源码分析(2)

2020-02-26  本文已影响0人  快点给我想个名

上次我们说到AnnotationAwareAspectJAutoProxyCreator类。那我们这次就简单看一下这个类。

继承结构
AnnotationAwareAspectJAutoProxyCreator继承结构图
从图中可以看到,首先其实现了BeanFactoryAware接口,通过该可以获得beanFactory工厂。其次实现了BeanPostProcessor接口,这个接口可以在bean调用init方法前后对bean进行一些处理。所以我们的AnnotationAwareAspectJAutoProxyCreator类目前已经具备了这两个功能。
接下来我们关注这两点就可以了。
  1. 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有关。

  1. BeanPostProcessor的能力
    这个接口中的方法在AbstractAutoProxyCreator类中被实现的。

现在我们知道如果项目启动,可以根据该@EnableAspectJAutoProxy注解为容器中加入一个类了,那这个类具体是怎么注册初始化的呢?下一篇继续分析

上一篇下一篇

猜你喜欢

热点阅读