AOP 代理对象的创建发生在 bean 初始化后。
代理创建器实现了 BeanPostProcessor 接口,并在 bean 初始化的后置处理过程中向 bean 中加入增强。
如下类图所示:
首先我们增加一个 AOP. 参考  spring - aop.
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 基于aspectj 注解 --><aop:aspectj-autoproxy proxy-target-class="true"/><!-- 接口 --><bean id="userService" class="cn.lichenghao.aop.jdk.service.impl.UserServiceImpl"></bean><!-- 通知类 --><bean id="aopLogger" class="cn.lichenghao.aop.AopLogger2"></bean></beans>
XML 定义 AOP 配置完毕后,启动容器会将对应的配置解析成 BeanDefinition 。
具体见:4. 解析 XML 文档 - doRegisterBeanDefinitions 自定义标签解析。
从 bean 初始化的后置处理器开始:
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {// 调用Aware相关方法// 执行前置处理器。包括Aware相关扩展接口// 执行自定义init方法// 执行后置处理器if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}
进入后置处理方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
@Overridepublic Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}
进入 AOP 后置处理器 AbstractAutoProxyCreator 实现 BeanPostProcessor 的方法 postProcessAfterInitialization.
具体实例为:
- AnnotationAwareAspectJAutoProxyCreator (使用 aspectj 注解的 aop)
 - AspectJAwareAdvisorAutoProxyCreator (使用 xml 的 aop)
 
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
@Overridepublic Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {if (bean != null) {// 获取缓存key// 如果是普通bean,则返回beanName,如果是FactoryBean,则返回加上前缀&的&beanNameObject cacheKey = getCacheKey(bean.getClass(), beanName);/*从earlyProxyReferences 缓存判断earlyProxyReferences中缓存的是已经创建好的代理对象如果bean不存在相互引用的话,那么这个this.earlyProxyReferences.remove(cacheKey)方法始终返回null*/if (this.earlyProxyReferences.remove(cacheKey) != bean) {// 说明移除缓存的不是FactoryBean,那么继续看是否需要被代理return wrapIfNecessary(bean, beanName, cacheKey);}}return bean;}
在初始化阶段,如果发生循环依赖,代理对象会提前创建放在缓存 earlyProxyReferences 中,
如果经过缓存 earlyProxyReferences 判断没有创建过代理的话,接下来就需要进行判断是否要为该对象创建代理对象。
