環境: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例項化的過程詳解原始碼分析