1.BeanFactoryPostProcessor
Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前(spring容器加载了bean的定义文件之后,在bean实例化之前)读取配置元数据,并可以根据需要进行修改。【#invokeBeanFactoryPostProcessors】
例如修改xxx的作用域
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("MyBeanFactoryPostProcessor..postProcessBeanFactory");
BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("xxx");
beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
}
}
2.BeanPostProcessor
bean的生命周期中,除了初始化bean和摧毁bean时可以自定义方法外,对于初始化前后还可以进行操作(干预Spring初始化bean的流程,在bean创建对象初始化前后进行拦截工作)
编写一个组件类实现BeanPostProcessor接口并且实现其内部postProcessBeforeInitialization,postProcessAfterInitialization方法即可。
顺序如下:
1.ioc实例化bean
2.调用postProcessBeforeInitialization方法进行初始化之前的操作
3.调用bean的初始化方法
4.调用postProcessAfterInitialization方法进行初始化之后的操作
debug源码可知doCreateBean期间,首先执行populateBean给bean进行属性赋值,然后执行initializeBan。
initializeBan中:applyBeanPostProcessorsBeforeInitialization初始化前->invokeInitMethods初始化->applyBeanPostProcessorsAfterInitialization初始化后
3.Aware
在bean被初始化之前,prepareBeanFactory方法会添加ApplicationContextAwareProcessor后置处理器。
会循环所有bean【refresh#finishBeanFactoryInitialization#preInstantiateSingletons->List<String> beanNames】,然后会走到initializeBean()->applyBeanPostProcessorsBeforeInitialization这个方法里,并且执行它们BeanPostProcessor的postProcessBeforeInitialization方法。每个xxxAware接口都有一个xxxAwareProcessor实现了BeanPostProcessor接口。
for(Iterator var4 = this.getBeanPostProcessors().iterator(); var4.hasNext(); result = current) {
BeanPostProcessor processor = (BeanPostProcessor)var4.next();
current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
}
ApplicationContextAwareProcessor内部会执行invokeAwareInterfaces方法,判断实现了哪些Aware从而设置对应的东西。
例如ApplicationContextAwareProcessor将ioc容器(applicationContext)设置进bean里面,从而让bean获取到applicationContext。
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware)bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware)bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware)bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware)bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware)bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationStartupAware) {
((ApplicationStartupAware)bean).setApplicationStartup(this.applicationContext.getApplicationStartup());
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
}