上一篇文章分析了自定义标签注册解析并且注册了AnnotationAwareAspectJAutoProxyCreator,我们可以看看这个类的层次结构:
可以看到AnnotationAwareAspectJAutoProxyCreator实现了BeanPostProcessor接口,当Spring加载这个bean的时候会在实例化前调用他的postProcessAfterInitialization方法
在父类AbstractAutoProxyCreator的postProcessAfterInitialization中的代码如下:
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
if (bean != null) {
// 根据给定的bean的class和name构建一个key
// 格式是:beanClassName_beanName
Object cacheKey = getCacheKey(bean.getClass(), beanName);
if (this.earlyProxyReferences.remove(cacheKey) != bean) {
// 如果他适合被代理,则需要封装指定bean
return wrapIfNecessary(bean, beanName, cacheKey);
}
}
return bean;
}
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
// 如果已经处理过
if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
return bean;
}
// 无须增强
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
return bean;
}
// 给定的bean类是否代表一个基础设施类,基础设施类不应该代理
// 或者配置了指定bean不需要自定代理
if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
// 如果存在增强方法则创建代理
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
// 如果获取到了增强则需要针对增强创建代理
if (specificInterceptors != DO_NOT_PROXY) {
this.advisedBeans.put(cacheKey, Boolean.TRUE);
/// 创建代理
Object proxy = createProxy(
bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
this.proxyTypes.put(cacheKey, proxy.getClass());
return proxy;
}
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
从上面的代码里可以看到代理创建的雏形,在真正开始创建之前还是需要进行一些判断.比如石佛已经处理过或者需要跳过代理,所以真正创建代理是从getAdvicesAndAdvisorsForBean方法开始的.
其实到这里,创建打代理的步骤就两个:
- 获取增强方法或者增强器
- 根据获取的增强进行代理
下面一篇文章就来分析增强器是怎么获取的.