结合Spring中AOP源码浅析① Spring中AOP源码浅析② 这两篇文章我们知道AOP的实现其实是通过引入AnnotationAwareAspectJAutoProxyCreator这个类(注解感知AspectJ自动代理创建器 BeanName:org.springframework.aop.config.internalAutoProxyCreator)去实现的。实际他的底层也是一个InstantiationAwareBeanPostProcessor后置处理器。结合两篇文章,简单画一下它的实现过程。
那么就来分析一下InstantiationAwareBeanPostProcessor 这个后置处理器的前置方法和后置方法分别做了哪些事情。
前置方法在resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd);这里执行,查看源码
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
//确保此时已经解析了Bean
//非合成Bean并且是InstantiationAwareBeanPostProcessors类型的后置处理器
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
//目标Bean的class
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
//执行后置处理器的前置方法
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
我们只需要关注bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);这个方法
@Nullable
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
//遍历所有后置处理器
for (BeanPostProcessor bp : getBeanPostProcessors()) {
//只拿到InstantiationAwareBeanPostProcessor类型的后置处理器
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
//执行前置方法
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
}
return null;
}
继续从Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);这里进去
这里InstantiationAwareBeanPostProcessor 这个处理器有多个实现类,我们只关注AOP相关的AbstractAutoProxyCreator<