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在初始化之前進行處理
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一些需要的成員變量沒有被賦值,就賦值上我們給的默認初始值
不過我們還需要臨時準備一些工具
-
創建一個註解
-
然後我們修改一下我們的目標bean
-
最後我們改動下我們的beanPostProcessor
-
對於postProcessBeforeInitialization而言,我們做如下改動
-
對於postProcessAfterInitialization而言,我們做如下改動
-
注意after之後的格式已經變成我們需要的json格式了,而目標bean也賦值上了我們的默認值
結語
到這我們對BeanPostProcessor的拋磚引玉也就結束了,但是對BeanPostProcessor的應用遠不止於此,相信細心的童鞋在springboot這個架子中,本身就有很多對BeanPostProcessor的應用,不失爲我們學習的一些標準代碼哦~
舉一些小例子好比我們對一些數據的篩選,以及數據bean的過濾等,加載一些配置文件等等,都是一個非常好的時機,對於我們的項目而言也優雅很多,更多精彩,就靠大家挖掘了!!