引言

在经过构造ClassPathXmlApplicationContext之后,已经解析了spring-config.xml。

1
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

通过Spring-IOC的分析知道通过实现BeanPostProcessor接口,能在实例化bean之前创建代理,从context中获取实现了BeanPostProcessor接口的实现类:

1
2
3
4
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
System.out.println(JSONObject.toJSONString(context.getBeansOfType(BeanPostProcessor.class)));
Object obj = context.getBean("org.springframework.aop.config.internalAutoProxyCreator");
System.out.println(obj.getClass());

结果:

1
2
{"org.springframework.aop.config.internalAutoProxyCreator":{"exposeProxy":false,"frozen":false,"opaque":false,"optimize":false,"order":-2147483648,"proxyTargetClass":false}}
class org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator

即注册了AnnotationAwareAspectJAutoProxyCreator。

那具体是什么时候将原始的bean实例增强的呢?
继续看代码:

1
2
CustomBean bean = context.getBean("customBean", CustomBean.class);
System.out.println(bean.toString());

发现这一步的时候确实是增强了的,而且取的是缓存中的实例,也就是说在构建ClassPathXmlApplicationContext的时候,就已经做过增强处理了。
通过一步一步的debug,找到了AbstractAutowireCapableBeanFactory类中的applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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;
}

即通过BeanPostProcessor接口的postProcessAfterInitialization(Object bean, String beanName)方法实现了bean实例的增强。
具体实现就在AnnotationAwareAspectJAutoProxyCreator的父类中。

本篇就分析到这里,找到增强bean实例的确切入口。

tencent.jpg