springboot~ConfigurableListableBeanFactory和ApplicationContext的使用場景
在工具類中封裝getBean,使用哪個接口來實現
實(shi)事上,在工具類(lei)中(zhong),實(shi)現BeanFactoryPostProcessor和(he)ApplicationContextAware接口后,使用(yong)它們構造方(fang)(fang)法(fa)(fa)里的(de)(de)(de)(de)對象ConfigurableListableBeanFactory和(he)ApplicationContext都可以很方(fang)(fang)便的(de)(de)(de)(de)獲取(qu)spring容(rong)器里的(de)(de)(de)(de)bean,而在實(shi)際(ji)應用(yong)時(shi),還有(you)有(you)些(xie)不同的(de)(de)(de)(de),比如在我(wo)們的(de)(de)(de)(de)@Configuration配(pei)置類(lei)中(zhong),我(wo)直(zhi)接使用(yong)ApplicationContextAware里的(de)(de)(de)(de)ApplicationContext對象來獲取(qu)bean,我(wo)是(shi)否(fou)工具類(lei)里的(de)(de)(de)(de),它是(shi)無法(fa)(fa)正(zheng)常得(de)到ApplicationContext對象的(de)(de)(de)(de),也就無法(fa)(fa)獲取(qu)bean了;而如果實(shi)現的(de)(de)(de)(de)是(shi)BeanFactoryPostProcessor接口,通(tong)過它的(de)(de)(de)(de)ConfigurableListableBeanFactory對象來獲取(qu)bean,結果是(shi)正(zheng)常的(de)(de)(de)(de),我(wo)應該與(yu)這兩個的(de)(de)(de)(de)加載機制有(you)關吧。
總結:當你封裝一個(ge)SpringUtils工具類時,獲取bean對(dui)象的(de)方法時,最好使用(yong)BeanFactoryPostProcessor接口里的(de)ConfigurableListableBeanFactory對(dui)象,這樣可以(yi)避免NPE(NullPointerException)的(de)問題。
使用場景和功能
ConfigurableListableBeanFactory 和 ApplicationContext 都是(shi) Spring 容器(qi)的接口(kou),它(ta)們有(you)各自的使用場(chang)景和功能(neng):
-
ConfigurableListableBeanFactory 的使用場景:
-
Bean 定義和注冊:
ConfigurableListableBeanFactory可(ke)用于(yu)創建和(he)注(zhu)冊(ce) Bean 的定義,通(tong)常在編程式配置 Spring 容(rong)器時使用。這對于(yu)需要動態創建和(he)注(zhu)冊(ce) Bean 定義的情況很有用。 -
Bean 的延遲初始化:您可以使用
ConfigurableListableBeanFactory來設置 Bean 的(de)延遲初始化屬性,使容(rong)器只(zhi)在需要時(shi)創建(jian) Bean 實例(li)。 -
Bean 后處理器:如果您需要自定義 Bean 后處理器,可以使用
ConfigurableListableBeanFactory來注冊這些處(chu)理器,以對 Bean 實例進行定制化(hua)的初始化(hua)或銷毀操作。 -
基本的 Bean 檢索:雖然
ConfigurableListableBeanFactory也(ye)允許您檢索 Bean 實例,但(dan)它通常用(yong)于基本(ben)的編程式 Bean 檢索,例如通過 Bean 名稱檢索。
-
-
ApplicationContext 的使用場景:
-
應用程序上下文管理:
ApplicationContext是(shi) Spring 應用程(cheng)序的(de)主(zhu)要上下(xia)文(wen)管(guan)理器。它(ta)通常用于加(jia)載和(he)管(guan)理應用程(cheng)序的(de)配(pei)置(zhi),包括 Bean 定(ding)義、配(pei)置(zhi)文(wen)件、資源、國際化等。 -
依賴注入:
ApplicationContext是依賴(lai)注入的核心容器(qi),它負(fu)責創建、配置和(he)管理 Bean 實例,并確保(bao)它們的依賴(lai)關系被滿足。 -
AOP 和事務管理:
ApplicationContext提供了 AOP 和事務(wu)管理的(de)支持,您可以(yi)配置切面、通知和事務(wu)策略(lve)。 -
國際化和消息源:
ApplicationContext提供了國(guo)際化和消息資(zi)源(yuan)管理的功(gong)能,使(shi)應用程序能夠支(zhi)持多語(yu)言和本地化。 -
事件發布:
ApplicationContext支持應用(yong)程(cheng)序內部事件(jian)(jian)的(de)發布(bu)和(he)監聽,這對于(yu)實現松耦合(he)的(de)組件(jian)(jian)通信非常(chang)有用(yong)。 -
Web 應用程序上下文:Spring 的
WebApplicationContext擴展了ApplicationContext,提供了在 Web 應用程(cheng)序中(zhong)的特(te)定功(gong)能,如 Servlet 上下文和 Web 事(shi)件處理。
-
總的來說,ConfigurableListableBeanFactory 主要用于編程式配置和基本的 Bean 定義、檢索以及自定義 Bean 處理。ApplicationContext 是一個更高級的容器,適用于應用程序上下文管理、依賴注入、AOP、事務、國際化、事件發布等高級功能,特別適合開發應用程序。在大多數情況下,應用程序中使用的容器通常是 ApplicationContext 或其派生類型。
區別
getBean 方法在 ConfigurableListableBeanFactory 和 ApplicationContext 接口中都存(cun)在,但它們之間有(you)一些重要的(de)區(qu)別(bie),主要涉及到 Spring 容器的(de)層次結構和功能。
-
ConfigurableListableBeanFactory:
ConfigurableListableBeanFactory是 Spring 容器中 Bean 工廠的接口,它提供了訪問和操作 Bean 定義和實例的基本方法。getBean方法允許從容器中獲取指定名稱的 Bean 實例,但通常需要傳遞類型參數用于類型安全檢查。這意味著它返回的是原始 Bean 實例,你需要自行轉型為具體的對象。ConfigurableListableBeanFactory不提供高級功能,如國際化、事件發布、AOP等,因為它的主要職責是管理 Bean 的定義和創建。
-
ApplicationContext:
ApplicationContext是 Spring 容器的更高級別接口,它擴展了ConfigurableListableBeanFactory并添加了更多功能。getBean方法在ApplicationContext中除了允許獲取 Bean 實例外,還允許傳遞 Bean 類型和其他可選參數來更精確地檢索 Bean。它返回的是 Bean 對象,無需手動進行類型轉換。ApplicationContext提供了更多的功能,如國際化、事件發布、資源訪問、AOP代理等。它還支持擴展,允許通過自定義的 Bean 后處理器等方式干預容器的行為。
總的來說,ConfigurableListableBeanFactory 是一個較低級別的 Bean 工廠接口,主要用于 Bean 的創建和管理。ApplicationContext 則是更高級別的接口,它構建在 ConfigurableListableBeanFactory 之上(shang)(shang),并提供了(le)更多功能和便捷性,通常更適合應用程序(xu)的上(shang)(shang)下文管理。