天天看點

spring步步前行(IOC)-大戰BeanPostProcessor

spring步步前行(IOC)-大戰BeanPostProcessor

在之前的文章中,我們分析了整個beanFactory,其中有一些配置我們還是不怎麼清楚,這一篇,我們仔細的分析BeanPostProcessor這個類的作用和存在的意義,并舉一些執行個體輔助我們了解BeanPostProcessor

官方解讀

首先我們看看官方對于BeanPostProcessor

spring步步前行(IOC)-大戰BeanPostProcessor

這個接口設計的是個相對factory的相關hook,具體功能是允許自定義修改新建立bean的執行個體,其具體描述ApplicationContexts會在對應的bean的definitions中自動檢測BeanPostProcessor,且在建立的任意bean後應用它,還可以通過factory給其他類進行注冊使用

講到這裡,我們可以發現BeanPostProcessor就是spring 給了我們一個修改bean的契機,我們通過beanDefinition查找到目标類,緊接着spring進行執行個體化該類,這樣我們就得到了目标bean,但是出于業務或其他等考慮,我們想對bean做一些更改,這個時候beanPostProcessor就是大發神威的時候了

到這裡,我們看看其具體的方法:

postProcessBeforeInitialization
spring步步前行(IOC)-大戰BeanPostProcessor

注意before,應用BeanPostProcessor傳回一個執行個體,在任何bean初始化回調之前,

(對于postProcessAfterInitialization也是一樣的)

當其他非實作BeanPostProcessor的bean且在同一個容器的bean在初始化的時候,才會回調這個方法
           

是以這個方法是作用BeanPostProcessor在初始化之前進行處理,

postProcessAfterInitialization
spring步步前行(IOC)-大戰BeanPostProcessor

注意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類,如下:

spring步步前行(IOC)-大戰BeanPostProcessor

接下來我們看看結果:

spring步步前行(IOC)-大戰BeanPostProcessor

我們可以看到,我們的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
spring步步前行(IOC)-大戰BeanPostProcessor

注意after之後的格式已經變成我們需要的json格式了,而目标bean也指派上了我們的預設值

結語

到這我們對BeanPostProcessor的抛磚引玉也就結束了,但是對BeanPostProcessor的應用遠不止于此,相信細心的童鞋在springboot這個架子中,本身就有很多對BeanPostProcessor的應用,不失為我們學習的一些标準代碼哦~

舉一些小例子好比我們對一些資料的篩選,以及資料bean的過濾等,加載一些配置檔案等等,都是一個非常好的時機,對于我們的項目而言也優雅很多,更多精彩,就靠大家挖掘了!!