spring步步前行(IOC)-大戰BeanPostProcessor
在之前的文章中,我們分析了整個beanFactory,其中有一些配置我們還是不怎麼清楚,這一篇,我們仔細的分析BeanPostProcessor這個類的作用和存在的意義,并舉一些執行個體輔助我們了解BeanPostProcessor
官方解讀
首先我們看看官方對于BeanPostProcessor

這個接口設計的是個相對factory的相關hook,具體功能是允許自定義修改新建立bean的執行個體,其具體描述ApplicationContexts會在對應的bean的definitions中自動檢測BeanPostProcessor,且在建立的任意bean後應用它,還可以通過factory給其他類進行注冊使用
講到這裡,我們可以發現BeanPostProcessor就是spring 給了我們一個修改bean的契機,我們通過beanDefinition查找到目标類,緊接着spring進行執行個體化該類,這樣我們就得到了目标bean,但是出于業務或其他等考慮,我們想對bean做一些更改,這個時候beanPostProcessor就是大發神威的時候了
到這裡,我們看看其具體的方法:
postProcessBeforeInitialization
注意before,應用BeanPostProcessor傳回一個執行個體,在任何bean初始化回調之前,
(對于postProcessAfterInitialization也是一樣的)
當其他非實作BeanPostProcessor的bean且在同一個容器的bean在初始化的時候,才會回調這個方法
是以這個方法是作用BeanPostProcessor在初始化之前進行處理,
postProcessAfterInitialization
注意after,是以這個方法是作用BeanPostProcessor在初始化之後進行處理
以上就是beanPostProcessor的具體方法和官方解讀,下面搞幾個例子,輔助解下beanPostProcessor毒,讓我們形成記憶神經元,哈哈哈
執行個體
先上一個簡易demo
首先我們先建構一個springboot環境,并建立一個我們調試的bean:
public class ClazzBean {
public String name;
public String clazz;
@Override
public String toString() {
return "ClazzBean{" +
"name='" + name + '\'' +
", clazz='" + clazz + '\'' +
'}';
}
}
接着我們想springboot容器中聲明我們測試bean:
@Bean
public ClazzBean getClazzBean() {
return new ClazzBean();
}
最後我們建立一個實作了BeanPostProcessor的Processor類,如下:
接下來我們看看結果:
我們可以看到,我們的BeanPostProcessor已經生效了。可能還有人迷惑,生效了我們能幹嘛用,下面再舉一個例子,抛磚引玉下
Demo2:
這裡我不打算新寫一個demo,我們在原有的demo1上進行修改,用來加深記憶,接下來我們要實作一個功能,
功能如下:
- 1.我們目标bean永遠傳回為json格式
- 2.若我們目标bean一些需要的成員變量沒有被指派,就指派上我們給的預設初始值
不過我們還需要臨時準備一些工具
- 建立一個注解
spring步步前行(IOC)-大戰BeanPostProcessor - 然後我們修改一下我們的目标bean
spring步步前行(IOC)-大戰BeanPostProcessor - 最後我們改動下我們的beanPostProcessor
- 對于postProcessBeforeInitialization而言,我們做如下改動
spring步步前行(IOC)-大戰BeanPostProcessor - 對于postProcessAfterInitialization而言,我們做如下改動
spring步步前行(IOC)-大戰BeanPostProcessor
- 對于postProcessBeforeInitialization而言,我們做如下改動
注意after之後的格式已經變成我們需要的json格式了,而目标bean也指派上了我們的預設值
結語
到這我們對BeanPostProcessor的抛磚引玉也就結束了,但是對BeanPostProcessor的應用遠不止于此,相信細心的童鞋在springboot這個架子中,本身就有很多對BeanPostProcessor的應用,不失為我們學習的一些标準代碼哦~
舉一些小例子好比我們對一些資料的篩選,以及資料bean的過濾等,加載一些配置檔案等等,都是一個非常好的時機,對于我們的項目而言也優雅很多,更多精彩,就靠大家挖掘了!!