IoC 容器負責管理容器中所有 bean 的生命週期, 而在 bean 生命週期的不同階段, Spring 提供了不同的擴充套件點來改變 bean 的命運. 在容器的啟動階段, BeanFactoryPostProcessor
允許我們在容器例項化相應物件之前, 對註冊到容器的 BeanDefinition
所儲存的資訊做一些額外的操作, 比如修改 bean 定義的某些屬性或者增加其他資訊等.
BeanPostProcessor 介面
如果希望在Spring容器完成例項化、配置和初始化bean之後實現某些自定義邏輯, 則可以實現一個或多個 BeanPostProcessor
介面.
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
在 Bean 例項化之後會先執行 postProcessBeforeInitialization
方法, 再執行 Bean 的初始化方法, 然後在執行 postProcessAfterInitialization
方法.
Ordered 介面 @Order 註解
此介面只有一個方法 int getOrder();
用來設定執行順序.
如果實現多個 BeanPostProcessor
介面, 我們就可以實現 Ordered
介面來設定執行順序.
@Component
public class Test implements BeanPostProcessor, Ordered {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public int getOrder() {
return 1;
}
}
也可以使用 @Order
註解進行排序
@Configuration
@Order(2)
public class Demo1Config {
@Bean
public Demo1Service demo1Service(){
System.out.println("demo1config 載入了");
return new Demo1Service();
}
}
BeanFactoryPostProcessor 介面
在容器例項化相應物件之前, 對註冊到容器的 BeanDefinition
所儲存的資訊做一些額外的操作可以實現此介面.
區別
BeanFactoryPostProcessor
會處理一些後設資料.
BeanPostProcessor
會處理例項化後的物件.