????????談到Spring,那勢必要講講容器 BeanFactory 和 ApplicationContext。
BeanFactory是什么?
????????BeanFactory,其實就是 Spring 容器,用于管理和操作 Spring 容器中的 Bean。可能此時又有初學的小伙伴會問:Bean 是什么?其實這就是對象,只不過這個對象是被 Spring Ioc 容器管理的。
BeanFactory 的主要功能
1. 創建 Bean
? ?BeanFactory
負責創建和管理 Bean 的生命周期。簡單來說,它就像是一個工廠,負責生產(創建)各種對象(Bean)。這些對象在創建時,BeanFactory
會根據配置文件(如 XML 文件)中的定義,初始化這些對象的屬性和行為。
2. 依賴注入
? ?BeanFactory
通過依賴注入(DI)機制將依賴關系注入到 Bean 中。想象一下,一個對象(Bean)需要使用另一個對象(依賴)來完成某些任務。BeanFactory
會自動將這些依賴對象注入到需要它們的 Bean 中,這樣你就不需要在代碼中手動創建這些依賴對象,使得代碼更加簡潔和易于維護。
3. 獲取 Bean
? ?BeanFactory
提供了方法來獲取 Bean 實例。當你需要使用某個 Bean 時,你可以通過 BeanFactory
提供的方法(如 getBean
)來獲取這個 Bean 的實例。這個過程就像是從工廠中取出一個已經生產好的產品一樣簡單。
????????下面舉一個例子:通過 BeanFactory 獲取所有的單例 Bean。
@SpringBootApplication
public class Application {public static void main(String[] args) {// 啟動 Spring 應用ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);// 通過反射獲取 DefaultSingletonBeanRegistry 類中的 singletonObjects 字段Field singletonObjectsField;try {singletonObjectsField = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");singletonObjectsField.setAccessible(true);// 獲取當前 Spring 容器的 BeanFactoryConfigurableListableBeanFactory beanFactory = context.getBeanFactory();// 通過反射獲取 singletonObjects 字段的值Map<String, Object> singletonObjects = (Map<String, Object>) singletonObjectsField.get(beanFactory);// 打印所有單例 BeansingletonObjects.forEach((beanName, beanInstance) -> {System.out.println(beanName + ": " + beanInstance.getClass().getName());});} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}// 關閉 Spring 容器context.close();}
}
????????另外,需要自己提前創建好 bean。方法有很多,簡便點,直接加類上加 @Component 即可,這使得該類可以被 Spring 容器自動檢測并注冊為一個 Bean。如下所示:
@Component
public class MyComponent {public void doSomething() {System.out.println("Doing something...");}
}
那它與 ApplicationContext 有什么區別?
????????可以從圖中看出,ApplicationContext
?可以說是更高級的容器,它繼承并擴展了 BeanFactory
的功能,提供了更多的功能。具體來說,ApplicationContext
多繼承了以下幾個接口:
-
MessageSource
:提供國際化消息支持,可以用于多語言應用。 -
EnvironmentCapable
:提供環境變量的訪問功能,可以獲取系統環境變量和配置文件中的屬性。 -
ResourcePatternResolver
:提供資源路徑解析功能,可以方便地加載資源文件。 -
ApplicationEventPublisher
:提供事件發布功能,可以發布和監聽應用事件。
總結
?????BeanFactory
:是最基本的 Spring 容器接口,提供 Bean 的創建、配置和組裝功能。適用于資源受限的環境,啟動速度快。
?????ApplicationContext
:是 BeanFactory
的子接口,提供了更多的高級功能,如事件傳播、國際化消息支持、資源訪問等。適用于大多數企業級應用,啟動時會自動初始化所有單例 Bean,提供更多的功能和便利性。