上一篇写了AspectJAutoProxyBeanDefinitionParser的注册,以及相关AOP属性的注册,接下来看下AspectJAutoProxyBeanDefinitionParser的自动注册以及它的层级结构。
从图中可以看到AnnotationAwareAspectJAutoProxyCreator实现了BeanPostProcessor,在之前的IOC章节我们之前描述过,Spring加载该bean后会在实例化前调用postProcessAfterInitialization()方法,而我们对于AOP逻辑的分析也由此开始。
【AbstractAutoProxyCreator】
talk is cheap, show you the code:
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) throws BeansException { if (bean != null) { //根据给定的class和name构建出key,格式:beanClassName_beanName Object cacheKey = getCacheKey(bean.getClass(), beanName); if (!this.earlyProxyReferences.contains(cacheKey)) { //如果他适合被代理,则需要封装指定bean return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; }
protected Object wrapIfNecessary(Object bean, @Nullable String beanName, Object cacheKey) { //如果已经处理过就直接返回 if (beanName != null && 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; } // Create proxy if we have advice. //如果存在增强方法则创建代理 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()开始的。
创建代理前主要包括两个步骤,如下:
这里再回顾下Spring-AOP的设计基础