Spring擴展點之BeanFactoryPostProcessor詳解
BeanFactoryPostProcessor
即:BeanFactory后置處理器,是實現Spring容器功能擴展的又一重要接口。它是對 BeanDefinition對象進行屬性相關的修改。
例如:修改bean屬性值,實現bean動態(tài)代理等。很多框架都是通過此接口實現對spring容器的擴展,例如mybatis與spring集成時,只定義了mapper接口,無實現類,但spring卻可以完成自動注入,是不是很神奇? 本文將通過簡單的例子,展現BeanFactoryPostProcessor的擴展能力。
說明:BeanDefinition對象,即:Bean定義對象,里面存儲著Bean標簽的所有信息,Spring就是通過BeanDefintion對象來生成最終的Bean實例。
執(zhí)行時機
所有的bean定義信息,已經被加載到IOC容器中,bean實例還沒有被初始化時,BeanFactoryPostProcessor被調用。
即:在bean定義已解決被加載到IOC容器中,還沒有初始化之前,我們可以悄悄的往容器中添加一些東西,進行一些小動作的修改。
使用
/**
* TODO 自定義BeanFactoryPostProcessor
* 執(zhí)行時間:所有的Bean定義信息已經加載到容器中,但是Bean實例還沒有被初始化.
*
* @author : lzb
* @date: 2021-03-15 17:42
*/
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("IOC 容器調用了MyBeanFactoryPostProcessor中重寫的postProcessBeanFactory方法");
for(String name:beanFactory.getBeanDefinitionNames()) {
if("person".equals(name)) {
System.out.println("將Person對象設置為懶加載");
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
beanDefinition.setLazyInit(true);
}
}
}
}
使其生效,有如下兩種方式:
方式一
使用@Configuration + @Bean 方式初始化
/**
* 定義一個主配置類,標識為@Configuration,通過@Bean方式初始化,注入IOC容器
*/
@Configuration
public class MainConfig {
@Bean
public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor () {
return new MyBeanFactoryPostProcessor();
}
}
方式二
使用@ComponentScan + @Component方式初始化
/**
* 使用@ComponentScan定義組件掃描包范圍,在可掃描的保范圍內,
* 然后使用@Component方式,將其定義為一個組件初始化,注入IOC容器
*/
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("IOC 容器調用了MyBeanFactoryPostProcessor中重寫的postProcessBeanFactory方法");
// 獲取Bean定義名稱,進行遍歷
for(String name:beanFactory.getBeanDefinitionNames()) {
// 如果是person對象
if("person".equals(name)) {
System.out.println("將Person對象設置為懶加載");
// 獲取person的BeanDefinition(Bean定義對象)
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
// 將Person對象設置為懶加載
beanDefinition.setLazyInit(true);
}
}
}
}
執(zhí)行結果

到此這篇關于Spring擴展點之BeanFactoryPostProcessor詳解的文章就介紹到這了,更多相關BeanFactoryPostProcessor詳解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

