今天聊一聊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是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。
在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開發框架。
今天的分享就到這裡,感謝你的觀看,我們下期見!