AOP入口类被设置到Spring容器之后就需要检查Bean是否需要生成代理对象,其实就是对BeanPostProcessor的运用,(AbstractAutoProxyCreator实现了BeanPostProcessor接口)


    当bean实例化的时候会判断该bean是否需要生成代理,AOP的入口是:

    AbstractAutowireCapableBeanFactory#doCreateBean
    在进行IOC ,DI做完之后Spring里面Bean的实例就可以用了,但是有的时候我们并不需要这个实例,而是需要拿到这个Bean的实例的代理.

    会调用

    AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)

    会调用
    AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization ,这个类就是AOP的入口类


    applyBeanPostProcessorsAfterInitialization调用入口接着调用BeanPostProcessor#postProcessAfterInitialization会执行到子类的
    AbstractAutoProxyCreator#postProcessAfterInitialization

    再调用AbstractAutoProxyCreator#wrapIfNecessary,在这个类里面有个细节,会调用
    AbstractAutoProxyCreator#getAdvicesAndAdvisorsForBean,返回值是一个名字为specificInterceptors数组
    getAdvicesAndAdvisorsForBean类的作用是收集有@Aspect注解的类,specificInterceptors容器如果不等于null的话,说明有切面,就会走下来调用
    AbstractAutoProxyCreator#createProxy 创建wrapIfNecessary方法签名入参bean的代理对象,在wrapIfNecessary方法会将符合切面条件的类创建出来代理对象出来,
    符合切面条件的类指的是被切面的类,比如说被@PointCut指定到的类.
    然后给这个代理对象的class放到proxyTypes容器里面.


    然后AbstractAutowireCapableBeanFactory#doCreateBean 走完initializeBean方法之后会接着走
    AbstractBeanFactory#registerDisposableBeanIfNecessary 对原始的bean(被代理的类)进行销毁类的注册.


    最后会返回上层方法 DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
    把beanName 和代理类(注意,不是原始的bean了)放入到singletonObjects容器里面.

    最后getBean()从IOC容器里面拿的就是代理实例了.