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

到此這篇關(guān)于Spring擴展點之BeanFactoryPostProcessor詳解的文章就介紹到這了,更多相關(guān)BeanFactoryPostProcessor詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)對數(shù)據(jù)庫慢查詢監(jiān)控的方案小結(jié)
在企業(yè)級應用開發(fā)中,數(shù)據(jù)庫性能往往是系統(tǒng)整體性能的關(guān)鍵瓶頸,因此,對數(shù)據(jù)庫慢查詢進行有效監(jiān)控和及時優(yōu)化,是保障系統(tǒng)穩(wěn)定運行的重要環(huán)節(jié),下面我們來看看SpringBoot實現(xiàn)慢查詢的6種監(jiān)控方案吧2025-06-06
IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄
這篇文章主要給大家介紹了關(guān)于IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
JavaWeb實現(xiàn)顯示mysql數(shù)據(jù)庫數(shù)據(jù)
MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在WEB應用方面MySQL是最好的。本文將利用JavaWeb實現(xiàn)顯示mysql數(shù)據(jù)庫數(shù)據(jù)功能,需要的可以參考一下2022-03-03
一行命令同時修改maven項目中多個module的版本號的方法
這篇文章主要介紹了一行命令同時修改maven項目中多個module的版本號的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06

