聊聊Spring擴充套件點BeanPostProcessor和BeanFactoryPostProcessor

2023-03-31 12:02:10

介紹

今天聊一聊spring中很重要的兩個擴充套件點BeanPostProcessor和BeanFactoryPostProcessor,spring之所以如次強大,是因為它提供了豐富的功能給我們使用,但是我覺得最強大的是它擴充套件點,因為有了各種擴充套件點,我們才能去開發一些自己的需求,一個框架的強大之處也在於它能否靈活的設定,能夠支援很好的擴充套件。

我們基於spring進行業務開發時,無非做的就是編寫各種bean,注入各種bean,編寫設定類等工作,如果沒有一些特殊的需求,我們基本上不用去使用spring的擴充套件點,spring已有的功能基本能滿足我們的需求,但是如果需要深度的開發,比如整合一些中介軟體,進行一些客製化化的開發,那麼它本身提供的實現可能就滿足不了需求或者不適合,所以這時候就需要我們使用擴充套件點。

簡單是因為有複雜的實現

我們使用spring進行專案開發的時候,可以說,萬物皆是bean,我們的工作也是寫bean,然後注入bean,傳統的MVC架構中,使用spring的話無非就是Controller層注入Service層,Service層注入Dao層,使用的註解無非也就是@Controller@Service@Repository@Component@Autowired等,專案中的設定類會使用@Configuration,然後整個專案就能執行起來,開發效率十分高,如果在沒有spring的時候,那麼就會變得很複雜,因為有了spring,所以一切都變得簡單。

能夠簡單的使用spring,完全得益於spring的底層設計,不過spring的底層是十分的複雜,我們使用@Component標註類,這個類就會被組裝成bean註冊進IOC容器中,我們使用@Autowired,它就能注入我們想要的bean,這一切都歸功於spring的底層,我們今天主要來說BeanPostProcessor和BeanFactoryPostProcessor。

BeanFactoryPostProcessor

BeanFactoryPostProcessor是bean進行範例化前的擴充套件點,範例化就是建立物件範例,通俗一點就是new,既然還沒有範例化,那麼此時的bean就處在定義階段,在spring中叫做BeanDefinition,也就是bean的定義資訊,這些資訊來自於我們定義的bean資訊,比如通過XML檔案定義bean,通過註解定義bean,然後這些資訊會被組裝進BeanDefinition中,當然我們也可以直接將屬性寫進BeanDefinition,BeanFactoryPostProcessor階段就可以對BeanDefinition進行一些設定,比如新增屬性,設定bean的作用域,是否懶載入等等,在spring底層用得很多多的ConfigurationClassPostProcessor,它是BeanFactoryPostProcessor的一個實現,它的作用是在spring啟動時處理@Configuration標註的類,為後續的操作奠定一個基礎,後續的很多bean的注入都是要依賴於它。

總而言之,BeanFactoryPostProcessor階段的作用就是操作BeanDefinition,註冊BeanDefinition,以方便後續bean的範例化,如果我們在使用中需要對Bean的元資訊進行進行一些客製化化,那麼我們就可以實現BeanFactoryPostProcessor。

BeanPostProcessor

在bean的元資訊定義完成並新增道BeanFactory中去後,就需要對bean進行範例化,因為只有範例化後的bean才能使用,BeanDefinition是不能被直接使用的,它只是一些元資訊,就好比我們要使用資料庫的連線池,那麼資料庫的JDBC連線串,使用者名稱,密碼,最大連線數這些就是元資訊,但是我查詢資料要使用的是連線池中的連線範例,同理,spring中要使用某個元件,那麼使用的是它的物件範例,所以就需要進行範例化,那麼範例化後,我們可能需要對bean做一些操作,BeanPostProcessor就是對範例化後的bean做一些操作。

BeanPostProcessor有很多實現,比如我們通過@Autowired注入bean時,那麼就會用到AutowiredAnnotationBeanPostProcessor,它會對@Autowired標註的欄位,setter方法,建構函式進行解析,然後實現注入,如果我們使用@Resource注入Bean時,會用到CommonAnnotationBeanPostProcessor,當我們使用事物時,會用到AnnotationAwareAspectJAutoProxyCreator,這些都是它的實現,從這裡可以看出,spring的設計時靈活的,可延伸的,當引入一些新的功能,那麼直接去實現相應的擴充套件就行,這個階段的bean時範例化後的bean,我們可以進行一些操作,比如檢查Bean範例的狀態或設定是否正確,並對其進行必要的修正或補充,也可以執行一些初始化方法。

總結

上面我們對BeanFactoryPostProcessor和BeanPostProcessor進行了簡單的講解,BeanFactoryPostProcessor的主要作用就是對BeanDefination進行操作,BeanPostProcessor主要是對範例化後的bean進行操作,spring之所以如此強大,就是因為它的擴充套件點和豐富的功能才使得它十分複雜,如果沒有這些,那麼spring其實就是將bean的範例放入一個Map中,僅此而已,但是因為有了這些擴充套件點,它才成為了最強大的Java開發框架。

今天的分享就到這裡,感謝你的觀看,我們下期見!