BeanPostProcessor和BeanFactoryPostProcessor的初始化
1. 前言
1. 前言
Spring容器可以使用BeanFactory按照用户的定义生成各种Bean,但是如果用户需要在生成Bean的过程中进行一些进行一些自定一加工,就需要用到BeanPostProcessor和BeanFactoryPostProcessor。其中BeanFactoryPostProcessor用于对BeanFactory进行处理,比如增加或者修改Bean的定义,而BeanPostProcessor用于对Bean的实例化前后进行处理。那么这些处理器是什么时候添加到Bean的容器中生效的呢?这些处理器的初始化环节在整个Spring容器启动过程中的位置如图中的红色方框部分所示。这个阶段执行完成之后,SprignFactory就已经基本初始化完成,用户可以通过GetBean获取对应的Bean。
Spring Refresh 阶段调用BeanFactoryPostProcessors和注册BeanPostProcessors的源码如下所示,注意BeanFactoryPostProcessors使用的是"invoke"描述,而BeanPostProcessors使用的是"register"。
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
2. BeanFactoryPostProcessor介绍
BeanFactoryPostProcessor是实现spring容器功能扩展的重要接口,例如修改bean属性值,实现bean动态代理等。很多框架都是通过此接口实现对spring容器的扩展,例如mybatis与spring集成时,只定义了mapper接口,无实现类,但spring却可以完成自动注入,是不是很神奇?BeanFactoryPostProcessor接口的定义如下:
@FunctionalInterface
public interface BeanFactoryPostProcessor {
/**
* Modify the application context's internal bean factory after its standard
* initialization. All bean definitions will have been loaded, but no beans
* will have been instantiated yet. This allows for overriding or adding
* properties even to eager-initializing beans.
*/
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
BeanFactoryPostProcessor接口是针对bean容器的,它的实现类可以在当前BeanFactory初始化(spring容器加载bean定义文件)后