BeanFactory的后处理:
BeanFacotry作为Spring中容器功能的基础,⽤
于存放所有已经加载的bean,为了保证程序上的⾼
可扩展性,Spring针对BeanFactory做了⼤量的扩
展,⽐如我们熟知的PostProcessor等都是在这⾥实
现的。
BeanFactoryPostProcessor接⼝跟
BeanPostProcessor类似,可以对bean的定义(配置
元数据)进⾏处理。也就是说,Spring IoC容器允
许BeanFactoryPostProcessor在容器实际实例化任何
其他的bean之前读取配置元数据,并有可能修改
它。如果你愿意,你可以配置多个
BeanFactoryPostProcessor。你还能通过设
置“order”属性来控制BeanFactoryPostProcessor的执
⾏次序(仅当BeanFactoryPostProcessor实现了
Ordered接⼝时你才可以设置此属性,因此在实现
BeanFactoryPostProcessor时,就应当考虑实现
Ordered接⼝)。
如果你想改变实际的bean实例(例如从配置元
数据创建的对象),那么你最好使⽤
BeanPostProcessor。同样地,
BeanFactoryPostProcessor的作⽤域范围是容器级
的。它只和你所使⽤的容器有关。如果你在容器
中定义⼀个BeanFactoryPostProcessor,它仅仅对此
容器中的bean进⾏后置处理。
BeanFactoryPostProcessor不会对定义在另⼀个容器
中的bean进⾏后置处理,即使这两个容器都是在同
⼀层次上。在Spring中存在对于
BeanFactoryPostProcessor的典型应⽤,⽐如
PropertyPlaceholderConfigurer。
BeanFactoryProcessor:
- bean工厂后置处理器核心接口
- 执行时机: 在bean调用构造函数,init方法,bean后处理器执行之前执行
- 方法作用: 主要用来对bean定义做一些改变
自定义bean工厂后置处理器
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { for(String name:beanFactory.getBeanDefinitionNames()) { if("lifeCycleBean".equals(name)) { log.debug("BeanFactoryPostProcessor-->bean工厂后置处理器>>>>>>> bean定义之后,实例化之前执行"); } } } }
BeanDefinitionRegistryPostProcessor-bean工厂定义注册后置处理器:
BeanFactoryPostProcessor工厂后置处理器子接口
执行时机: 在bean调用构造函数,init方法,bean后处理器执行,BeanFactoryPostProcessor-bean工厂后置处理器之前执行
方法作用: 用来注册更多的bean到spring容器
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
for(String name:beanFactory.getBeanDefinitionNames()) {
if("lifeCycleBean".equals(name)) {
log.debug("BeanDefinitionRegistryPostProcessor-->bean工厂后置处理器>>>>>>> bean定义之后,实例化之前执行,对bean做一些改变");
}
}
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
for(String name:beanDefinitionRegistry.getBeanDefinitionNames()) {
if("lifeCycleBean".equals(name)) {
log.debug("BeanDefinitionRegistryPostProcessor-->bean工厂后置处理器>>>>>>> bean定义之后,实例化之前执行,注册更多的bean到容器");
}
}
}
}