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容器里面拿的就是代理实例了.