Spring容器物件BeanFactory與ApplicationContext你都清楚了嗎?

環境:Spring5。3。10

BeanFactory

BeanFactoryAPI為Spring的IoC功能提供了基礎。它的特定契約主要用於與Spring和相關第三方框架的其他部分整合,其DefaultListableBeanFactory實現是更高級別的GenericaApplicationContext容器中的一個關鍵委託。

BeanFactory和相關介面(如BeanFactoryAware、InitializingBean、DisposableBean)是其他框架元件的重要整合點。不需要任何註釋或者反射,它們允許容器及其元件之間進行非常有效的互動。應用程式級bean可以使用相同的回撥介面,但通常更喜歡透過註釋或程式設計配置進行宣告性依賴項注入。

請注意,核心BeanFactory API級別及其DefaultListableBeanFactory實現不對要使用的配置設計或任何元件註釋進行承擔。所有這些風格都是透過擴充套件(如XmlBeanDefinitionReader和AutowiredNotationBeanPostProcessor)引入的,並作為核心元資料表示在共享BeanDefinition物件上操作。這就是Spring容器如此靈活和可擴充套件的本質所在。簡單說就是核心的BeanFactory API不做配置或者是註解進行處理,這些處理都是透過擴充套件實現(如:BeanPostProcessor來實現AOP)。

BeanFactory or ApplicationContext 差異

除非有充分的理由,否則應該使用ApplicationContext,將GenericaApplicationContext及其子類AnnotationConfigApplicationContext作為自定義啟動容器的常見實現。這些是Spring核心容器的主要入口點,用於所有常見目的:載入配置檔案、觸發類路徑掃描、以程式設計方式註冊bean定義和註釋類,以及(從5。0開始)註冊函式bean定義。

由於ApplicationContext包含BeanFactory的所有功能,因此通常建議不要使用普通BeanFactory,除非需要完全控制bean處理。在ApplicationContext(如GenericaApplicationContext實現)中,透過約定(即,透過bean名稱或bean型別)檢測幾種bean — 特別是後處理器),而普通的DefaultListableBeanFactory對任何特殊bean都是不可知的。

對於許多擴充套件容器特性,例如註釋處理和AOP代理,BeanPostProcessor擴充套件點是必不可少的。如果只使用普通的DefaultListableBeanFactory,則預設情況下不會檢測和啟用此類後處理器。這種情況可能令人困惑,因為您的bean配置實際上沒有任何問題。相反,在這種情況下,需要透過額外的設定來完全配置啟動容器。簡單說如果你使用DefaultListableBeanFactory那麼你的註解處理和AOP都將不會生效,除非自己去設定這些BeanPostProcessor。

下表列出了BeanFactory和ApplicationContext介面和實現提供的功能。

功能

BeanFactory

ApplicationContext

Bean例項化

Yes

Yes

生命週期管理

No

Yes

自動註冊BeanPostProcessor

No

Yes

自動註冊BeanFactoryPostProcessor

No

Yes

方便的訊息源訪問(用於國際化)

No

Yes

內建ApplicationEvent釋出機制

No

Yes

手動註冊

如要應用BeanPostProcessor則需要程式設計的方式註冊。

要向DefaultListableBeanFactory顯式註冊bean後處理器,需要以程式設計方式呼叫addBeanPostProcessor,如下例所示:

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();// populate the factory with bean definitions// 註冊需要的BeanPostProcessor例項factory。addBeanPostProcessor(new AutowiredAnnotationBeanPostProcessor());factory。addBeanPostProcessor(new MyBeanPostProcessor());// 現在可以啟動factory容器了

要將BeanFactory後處理器應用於普通DefaultListableBeanFactory,需要呼叫其後處理BeanFactory方法,如下例所示:

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);reader。loadBeanDefinitions(new FileSystemResource(“beans。xml”));// 從屬性檔案中引入一些屬性值PropertySourcesPlaceholderConfigurer cfg = new PropertySourcesPlaceholderConfigurer();cfg。setLocation(new FileSystemResource(“jdbc。properties”));cfg。postProcessBeanFactory(factory);

在這兩種情況下,顯式註冊步驟都不方便,這就是為什麼在Spring支援的應用程式中,各種ApplicationContext變體比普通的DefaultListableBeanFactory更受歡迎的原因,特別是在典型的企業設定中,依賴BeanFactoryPostProcessor和BeanPostProcessor例項實現擴充套件容器功能時。

完畢!!!

求個

關注

公眾:

Springboot實戰案例錦集

Spring MVC 非同步請求方式

Spring事務實現原理原始碼分析

Spring MVC 異常處理方式

Spring Retry重試框架的應用

Spring 自定義Advisor以程式設計的方式實現AOP

SpringBoot專案中應用Spring Batch批處理框架,處理大資料新方案

Spring Boot Security防重登入及線上總數

Spring註解@Qualifier這種用法你知道嗎?

Spring IOC容器對Bean例項化的過程詳解原始碼分析

Spring容器物件BeanFactory與ApplicationContext你都清楚了嗎?

Spring容器物件BeanFactory與ApplicationContext你都清楚了嗎?

Spring容器物件BeanFactory與ApplicationContext你都清楚了嗎?

Spring容器物件BeanFactory與ApplicationContext你都清楚了嗎?