在工具類中封裝getBean,使用哪個介面來實現 實事上,在工具類中,實現BeanFactoryPostProcessor和ApplicationContextAware介面後,使用它們構造方法里的對象ConfigurableListableBeanFactory和ApplicationContex ...
在工具類中封裝getBean,使用哪個介面來實現
實事上,在工具類中,實現BeanFactoryPostProcessor和ApplicationContextAware介面後,使用它們構造方法里的對象ConfigurableListableBeanFactory和ApplicationContext都可以很方便的獲取spring容器里的bean,而在實際應用時,還有有些不同的,比如在我們的@Configuration配置類中,我直接使用ApplicationContextAware里的ApplicationContext對象來獲取bean,我是否工具類里的,它是無法正常得到ApplicationContext對象的,也就無法獲取bean了;而如果實現的是BeanFactoryPostProcessor介面,通過它的ConfigurableListableBeanFactory對象來獲取bean,結果是正常的,我應該與這兩個的載入機制有關吧。
總結:當你封裝一個SpringUtils工具類時,獲取bean對象的方法時,最好使用BeanFactoryPostProcessor介面里的ConfigurableListableBeanFactory對象,這樣可以避免NPE(NullPointerException)的問題。
使用場景和功能
ConfigurableListableBeanFactory
和 ApplicationContext
都是 Spring 容器的介面,它們有各自的使用場景和功能:
-
ConfigurableListableBeanFactory 的使用場景:
-
Bean 定義和註冊:
ConfigurableListableBeanFactory
可用於創建和註冊 Bean 的定義,通常在編程式配置 Spring 容器時使用。這對於需要動態創建和註冊 Bean 定義的情況很有用。 -
Bean 的延遲初始化:您可以使用
ConfigurableListableBeanFactory
來設置 Bean 的延遲初始化屬性,使容器只在需要時創建 Bean 實例。 -
Bean 後處理器:如果您需要自定義 Bean 後處理器,可以使用
ConfigurableListableBeanFactory
來註冊這些處理器,以對 Bean 實例進行定製化的初始化或銷毀操作。 -
基本的 Bean 檢索:雖然
ConfigurableListableBeanFactory
也允許您檢索 Bean 實例,但它通常用於基本的編程式 Bean 檢索,例如通過 Bean 名稱檢索。
-
-
ApplicationContext 的使用場景:
-
應用程式上下文管理:
ApplicationContext
是 Spring 應用程式的主要上下文管理器。它通常用於載入和管理應用程式的配置,包括 Bean 定義、配置文件、資源、國際化等。 -
依賴註入:
ApplicationContext
是依賴註入的核心容器,它負責創建、配置和管理 Bean 實例,並確保它們的依賴關係被滿足。 -
AOP 和事務管理:
ApplicationContext
提供了 AOP 和事務管理的支持,您可以配置切麵、通知和事務策略。 -
國際化和消息源:
ApplicationContext
提供了國際化和消息資源管理的功能,使應用程式能夠支持多語言和本地化。 -
事件發佈:
ApplicationContext
支持應用程式內部事件的發佈和監聽,這對於實現松耦合的組件通信非常有用。 -
Web 應用程式上下文:Spring 的
WebApplicationContext
擴展了ApplicationContext
,提供了在 Web 應用程式中的特定功能,如 Servlet 上下文和 Web 事件處理。
-
總的來說,ConfigurableListableBeanFactory
主要用於編程式配置和基本的 Bean 定義、檢索以及自定義 Bean 處理。ApplicationContext
是一個更高級的容器,適用於應用程式上下文管理、依賴註入、AOP、事務、國際化、事件發佈等高級功能,特別適合開發應用程式。在大多數情況下,應用程式中使用的容器通常是 ApplicationContext
或其派生類型。
區別
getBean
方法在 ConfigurableListableBeanFactory
和 ApplicationContext
介面中都存在,但它們之間有一些重要的區別,主要涉及到 Spring 容器的層次結構和功能。
-
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
之上,並提供了更多功能和便捷性,通常更適合應用程式的上下文管理。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!