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/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://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
@Override
public 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
@Override
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
if (bean != null) {
// 获取缓存key
// 如果是普通bean,则返回beanName,如果是FactoryBean,则返回加上前缀&的&beanName
Object 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 判断没有创建过代理的话,接下来就需要进行判断是否要为该对象创建代理对象。