Spring_BeanFactory\FactoryBean\ApplicationContext的區別

BeanFactory

BeanFactory定義了 IOC 容器的最基本形式,並提供了 IOC 容器應遵守的的最基本的接口,也就是 Spring IOC 所遵守的最底層和最基本的編程規範。在 Spring 代碼中, BeanFactory 只是個接口,並不是 IOC 容器的具體實現,但是 Spring 容器給出了很多種實現,如 DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext 等,都是附加了某種功能的實現.

FactoryBean

一般情況下,Spring 通過反射機制指定實現類實例化 Bean ,在某些情況下,實例化 Bean 過程比較複雜,如果按照傳統的方式,則需要在 bean中提供大量的配置信息。配置方式的靈活性是受限的,這時採用編碼的方式可能會得到一個簡單的方案。 Spring 爲此提供了一個 org.springframework.bean.factory.FactoryBean 的工廠類接口,用戶可以通過實現該接口定製實例化 Bean 的邏輯。

ApplicationContext

在這裏插入圖片描述

  • 國際化
    BeanFactory是不支持國際化功能的,因爲BeanFactory沒有擴展Spring中MessageResource接口。相反,由於ApplicationContext擴展了MessageResource接口,因而具有消息處理的能力(i18N)

  • 強大的事件機制(Event)
    基本上牽涉到事件(Event)方面的設計,就離不開觀察者模式,
    ApplicationContext的事件機制主要通過ApplicationEvent和ApplicationListener這兩個接口來提供的,和java swing中的事件機制一樣。即當ApplicationContext中發佈一個事件的時,所有擴展了ApplicationListener的Bean都將會接受到這個事件,並進行相應的處理。

  • 底層資源的訪問
    ApplicationContext擴展了ResourceLoader(資源加載器)接口,從而可以用來加載多個Resource,而BeanFactory是沒有擴展ResourceLoader

  • 對Web應用的支持
    與BeanFactory通常以編程的方式被創建不同的是,ApplicationContext能以聲明的方式創建,如使用ContextLoader。當然你也可以使用ApplicationContext的實現之一來以編程的方式創建ApplicationContext實例 。

  • 延遲加載

    • BeanFactroy採用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),纔對該Bean進行加載實例化,這樣,我們就不能發現一些存在的spring的配置問題。而ApplicationContext則相反,它是在容器啓動時,一次性創建了所有的Bean。這樣,在容器啓動時,我們就可以發現Spring中存在的配置錯誤。

    • BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區別是:BeanFactory需要手動註冊,而ApplicationContext則是自動註冊

ApplicationContext繼承了BeanFactory,BeanFactory是Spring中比較原始的Factory,它不支持AOP、Web等Spring插件,而ApplicationContext不僅包含了BeanFactory的所有功能,還支持Spring的各種插件,還以一種面向框架的方式工作以及對上下文進行分層和實現繼承。
BeanFactory是Spring框架的基礎設施,面向Spring本身;而ApplicationContext面向使用Spring的開發者,相比BeanFactory提供了更多面向實際應用的功能,幾乎所有場合都可以直接使用ApplicationContext而不是底層的BeanFactory

參考

https://www.iteye.com/blog/chenzehe-1481476
https://www.jianshu.com/p/f13f554ee8ce

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章