BeanFactory與ApplicationContext之間的關(guān)系
.BeanFactory與ApplicationContext之間的關(guān)系

(1)從繼承關(guān)系上來看:
BeanFactory它是ApplicationContext 的父接口
(2)從功能上來看:
BeanFactory才是spring中的核心容器,而ApplicationContext 是組合或者說是借助了(繼承)了BeanFactory的功能。
1.1什么是BeanFactory?
表面上我們用到了getbean方法
實際上:IOC,DI以及Bean的生命周期的各種功能都有它的實現(xiàn)類提供的。
補充:
這個實現(xiàn)類是誰==》DefaultListableBeanFactory

關(guān)于DefaultListableBeanFactory
它有一個繼承的接口DefaultSingletonBeanRegistry,該類的有一個成員變量用來存放單例的Bean
在這段代碼中,singletonObjects 是一個 ConcurrentHashMap 類型的對象,它是線程安全的哈希表實現(xiàn)。ConcurrentHashMap 允許多個線程同時進行讀取和寫入操作,保證了并發(fā)訪問的安全性。
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
該 Map 的鍵為字符串類型,表示 bean 的名字或唯一標(biāo)識符,值為 Object 類型,表示對應(yīng)的 bean 實例。通過使用鍵值對的方式來存儲和管理 bean 實例,我們可以使用 bean 的名字作為鍵來快速查找和訪問對應(yīng)的 bean。
這是 Spring 容器內(nèi)部的一個數(shù)據(jù)結(jié)構(gòu),用于存儲已經(jīng)創(chuàng)建的單例 bean 實例。當(dāng)需要獲取一個單例 bean 時,Spring 會首先在 singletonObjects 中查找,如果存在則直接返回,否則會創(chuàng)建新的實例并放入 singletonObjects 中緩存起來,以便下次使用。
標(biāo)準(zhǔn)一點回答:
BeanFactory
是 Spring 框架中的一種核心機制,用于管理和提供應(yīng)用程序中的對象實例,也被稱為 bean。在 Spring 中,我們可以通過配置文件或注解定義各種 bean 對象,這些 bean 對象可以是服務(wù)、數(shù)據(jù)訪問對象(DAO)、控制器等。
BeanFactory
的作用是在應(yīng)用程序運行時負責(zé)創(chuàng)建、管理和提供這些 bean 實例。
BeanFactory
主要提供以下功能:
Bean 實例化:
BeanFactory
負責(zé)根據(jù)配置信息或注解來實例化 bean 對象。它會根據(jù) bean 的定義和配置信息,使用適當(dāng)?shù)膶嵗呗裕ㄈ鐦?gòu)造函數(shù)實例化、工廠方法實例化等)創(chuàng)建 bean 的實例。依賴注入:
BeanFactory
負責(zé)管理 bean 之間的依賴關(guān)系。通過配置文件或注解,我們可以聲明 bean 之間的依賴關(guān)系,BeanFactory
在創(chuàng)建 bean 實例時自動處理這些依賴,將依賴的對象注入到需要的位置。生命周期管理:
BeanFactory
管理 bean 的生命周期。它負責(zé)調(diào)用 bean 的初始化方法和銷毀方法(如果定義了的話)。懶加載:
BeanFactory
支持懶加載(Lazy Initialization),即只有在需要訪問 bean 時才會進行實例化。這樣可以提高應(yīng)用程序的性能,避免不必要的對象創(chuàng)建和資源占用。
BeanFactory
是 Spring 容器的核心接口,它有許多具體的實現(xiàn),如 XMLBeanFactory、ApplicationContext 等。我們可以根據(jù)具體的需求選擇適合的實現(xiàn)類來管理和獲取 bean 實例。通過BeanFactory
,我們可以實現(xiàn)松耦合、可擴展和易于維護的應(yīng)用程序架構(gòu)。
MessageSource
是 Spring 框架中的一個接口,用于支持國際化和本地化的消息資源管理。在應(yīng)用程序中,我們通常需要顯示用戶界面上的文本消息,如錯誤消息、警告消息或其他用戶提示信息。使用
MessageSource
接口可以幫助我們管理這些文本消息,使其能夠根據(jù)不同的語言和地區(qū)進行動態(tài)的翻譯和顯示。1.2 ApplicationContext

從類圖上來看ApplicationContext繼承除BeanFactory的兩個子接口還繼承了其余四個接口來擴展功能:
MessageSource, ApplicationEventPublisher, ResourcePatternResolver,EnvironmentCapableMessageSource 提供了以下主要功能:
獲取消息:通過調(diào)用
getMessage()
方法,我們可以根據(jù)給定的消息代碼和可選的參數(shù)從消息源中獲取相應(yīng)的文本消息。這個方法基于當(dāng)前的語言環(huán)境(Locale)自動選擇適當(dāng)?shù)南ⅰ?/p>多語言支持:
MessageSource
支持多語言的消息資源管理。我們可以為每個支持的語言和地區(qū)提供對應(yīng)的消息資源文件,其中包含了相同的消息代碼但是具有不同的翻譯內(nèi)容。根據(jù)當(dāng)前的語言環(huán)境,MessageSource
可以自動選擇正確的消息資源文件來獲取對應(yīng)的翻譯文本。占位符和參數(shù)化消息:
MessageSource
支持在消息文本中使用占位符和參數(shù)化的消息。我們可以在消息文本中使用占位符,然后通過傳遞參數(shù)來實現(xiàn)動態(tài)替換。這樣可以更靈活地構(gòu)建消息,適應(yīng)不同的上下文和需求。通過使用
MessageSource
,我們可以實現(xiàn)應(yīng)用程序的國際化,使其能夠適應(yīng)不同語言和地區(qū)的用戶。它提供了一種方便和可擴展的方式來管理和顯示多語言的文本消息。ApplicationEventPublisher是Spring框架中的一個接口,用于在應(yīng)用程序中發(fā)布事件,并通知所有已注冊的事件監(jiān)聽器。
主要功能:
它的主要作用是實現(xiàn)應(yīng)用程序中不同組件之間的解耦。當(dāng)某個組件或模塊執(zhí)行某個重要操作時,它可以使用ApplicationEventPublisher來發(fā)布相關(guān)事件,而不需要直接調(diào)用其他組件或模塊的方法。這樣,該組件與其他組件的關(guān)系變得松散,提高了代碼的可維護性和可擴展性。
簡單地從理解層面來說:
ApplicationEventPublisher用于發(fā)布事件消息給對該事件感興趣的監(jiān)聽者。
具體來說,當(dāng)某個事件發(fā)生時,比如訂單下單事件,在相應(yīng)的代碼邏輯執(zhí)行完成后,使用ApplicationEventPublisher可以將該事件發(fā)布出去。發(fā)布事件的動作將會觸發(fā)所有對該事件感興趣的監(jiān)聽器進行相應(yīng)的處理。
監(jiān)聽器負責(zé)訂閱(注冊)所關(guān)心的事件,并在事件發(fā)生時執(zhí)行特定的邏輯。通過監(jiān)聽器的注冊和事件的發(fā)布,實現(xiàn)了模塊或組件之間的解耦。發(fā)布者只需要關(guān)心事件的發(fā)布,而具體的處理邏輯則由監(jiān)聽器來實現(xiàn)。
簡而言之,ApplicationEventPublisher是用來發(fā)布事件消息的,它負責(zé)將事件通知傳遞給對該事件感興趣的監(jiān)聽者。這樣,監(jiān)聽者就可以根據(jù)自己的需求來訂閱并處理相應(yīng)事件,實現(xiàn)系統(tǒng)的解耦和靈活性。
ResourcePatternResolver是Spring框架中的接口,用于解析資源路徑模式并獲取匹配的資源。
ResourcePatternResolver的主要作用是根據(jù)指定的資源路徑模式,獲取匹配的資源。資源可以是文件、類路徑下的資源或者其他可訪問的資源。它擴展了ResourceLoader接口,提供了更靈活的資源加載和解析功能。
通過ResourcePatternResolver,可以使用通配符和模式匹配的方式獲取一組符合條件的資源。這在很多場景下非常有用,例如:
批量加載資源:當(dāng)需要加載多個資源時,可以使用資源路徑模式來批量獲取符合條件的資源,而不需要逐個指定資源路徑。
動態(tài)加載資源:資源路徑模式可以在運行時動態(tài)地構(gòu)建,以滿足特定需求。這樣可以使系統(tǒng)更具靈活性和可擴展性。
配置文件加載:通過配置文件指定資源路徑模式,可以方便地加載配置文件所在的目錄下的所有符合條件的資源。
舉個例子,假設(shè)我們有一個Spring項目,需要加載所有類路徑下以
.xml
為后綴的配置文件。使用ResourcePatternResolver,我們可以定義一個資源路徑模式類似于classpath*:**/*.xml
,然后調(diào)用相應(yīng)方法來獲取所有匹配的配置文件資源。總之,ResourcePatternResolver提供了一種便捷的方式來根據(jù)資源路徑模式獲取匹配的資源,使得資源加載更加靈活和可配置。使用它可以簡化代碼,提高系統(tǒng)的可擴展性和可維護性。
EnvironmentCapable是Spring框架中的一個接口,用于表示實現(xiàn)該接口的對象具有獲取運行環(huán)境(Environment)的能力。
通過實現(xiàn)EnvironmentCapable接口,可以讓對象獲取當(dāng)前應(yīng)用程序的運行環(huán)境。運行環(huán)境包括了一些與應(yīng)用程序相關(guān)的配置和屬性信息,比如操作系統(tǒng)信息、系統(tǒng)屬性、環(huán)境變量等。
EnvironmentCapable接口主要定義了一個方法:
Environment getEnvironment();該方法返回一個Environment對象,通過該對象可以獲取當(dāng)前運行環(huán)境的各種屬性和配置值。
EnvironmentCapable的作用是使對象能夠根據(jù)運行環(huán)境的不同來適應(yīng)性地執(zhí)行邏輯。例如,根據(jù)當(dāng)前環(huán)境的配置信息,可以進行相應(yīng)的初始化、配置加載或其他操作。
在Spring框架中,很多核心組件都實現(xiàn)了EnvironmentCapable接口,以便根據(jù)不同的運行環(huán)境進行適配和處理。比如ApplicationContext就是EnvironmentCapable的子接口之一,它可以獲取運行環(huán)境并進行相應(yīng)的Bean加載和管理。