今天我们来看一下Spring常用的PostProcessor
他们的命名风格都是xxxPostProcessor
BeanDefinitionRegistryPostProcessor
postProcessBeanDefinitionRegistry可以额外的注册bean
因此postProcessBeanDefinitionRegistry的自由度是很高的
BeanFactoryPostProcessor
BeanFactoryPostProcessor也可以额外的注册bean,细节功能不同
InstantiationAwareBeanPostProcessor
postProcessBeforeInstantiation在bean的实例化之前执行,默认返回null,如果返回的不是null则表示我们提前给予了bean实例,Spring将短路入参的beanClass的实例化(即不对beanClass实例化)
而postProcessAfterInstantiation则可以处理一些后置事项,一般比较少用到
BeanPostProcessor
postProcessBeforeInitialization在bean的初始化之前执行,在这里甚至可以替换bean
可以看到bean被替换
postProcessAfterInitialization同样也可以替换bean,而它与postProcessBeforeInitialization之间间隔的是bean的init过程,这个我们在Springboot 启动过程_icodegarden的博客-CSDN博客 中的refresh方法中的finishBeanFactoryInitialization(beanFactory); 已经看过
DestructionAwareBeanPostProcessor
在bean的destory之前执行,在 Springboot 关闭过程_icodegarden的博客-CSDN博客 中我们已经看过Spring的关闭
EnvironmentPostProcessor
这个是在Environment创建后触发的
我们看到是在收到后ApplicationEnvironmentPreparedEvent触发的,而这个事件是在启动过程中的run方法中的ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments); 中发出的Springboot 启动过程_icodegarden的博客-CSDN博客
Environment可以让我们做更多的处理,例如增加配置源,像IntegrationPropertiesEnvironmentPostProcessor处理