BeanFactory和ApplicationContext的區別總結


BeanFactory:
是Spring里面最底層的接口,提供了最簡單的容器的功能,只提供了實例化對象和拿對象的功能;
ApplicationContext:
應用上下文,繼承BeanFactory接口,它是Spring的一各更高級的容器,提供了更多的有用的功能;

  • 1) 國際化(MessageSource)
  • 2) 訪問資源,如URL和文件(ResourceLoader)
  • 3) 載入多個(有繼承關系)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層
  • 4) 消息發送、響應機制(ApplicationEventPublisher)
  • 5) AOP(攔截器)

兩者裝載bean的區別
BeanFactory:BeanFactory在啟動的時候不會去實例化Bean,中有從容器中拿Bean的時候才會去實例化;
ApplicationContext:ApplicationContext在啟動的時候就把所有的Bean全部實例化了。它還可以為Bean配置lazy-init=true來讓Bean延遲實例化;
我們該用BeanFactory還是ApplicationContent
延遲實例化的優點:(BeanFactory)

  • 應用啟動的時候占用資源很少;對資源要求較高的應用,比較有優勢;

不延遲實例化的優點: (ApplicationContext)

  • 1. 所有的Bean在啟動的時候都加載,系統運行的速度快;
  • 2. 在啟動的時候所有的Bean都加載了,我們就能在系統啟動的時候,盡早的發現系統中的配置問題
  • 3. 建議web應用,在啟動的時候就把所有的Bean都加載了。(把費時的操作放到系統啟動中完成)

BeanFactory類關系繼承圖

1. BeanFactory類結構體系:
BeanFactory接口及其子類定義了Spring IoC容器體系結構,由於BeanFactory體系非常的龐大和復雜,因此要理解Spring IoC,需要先理清BeanFactory的繼承機構。

 

2. ApplicationContext的結構體系:
ApplicationContext接口是一個BeanFactory基礎上封裝了更多功能的,Spring中最為常用的IoC容器,其包含兩個子接口:ConfigurableApplicationContext、WebApplicationContext。
ConfigurableApplicationContext其結構體系如下:

詳細的結構體系如下:
a.AbstractApplicationContext結構體系如下:

b.ConfigurablePortletApplicationContext體系結構如下:

c.ConfigurableWebApplicationContext結構體系如下:

2).WebApplicationContext體系結構如下:

1、容器是spring的核心,使IoC管理所有和組件
2、spring的兩種容器:

  • a、BeanFactoy
  • b、ApplicationContext應用上下文

3、BeanFactory:BeanhFactory使用延遲加載所有的Bean,為了從BeanhFactory得到一個Bean,只要調用getBean()方法,就能獲得Bean
4、ApplicationContext:

  • a、提供文本信息解析,支持I18N
  • b、提供載入文件資源的通用方法
  • c、向注冊為監聽器的Bean發送事件
  • d、ApplicationContext接口擴展BeanFactory接口
  • e、ApplicationContext提供附加功能

5、ApplicationContext的三個實現類:

  • a、ClassPathXmlApplication:把上下文文件當成類路徑資源
  • b、FileSystemXmlApplication:從文件系統中的XML文件載入上下文定義信息
  • c、XmlWebApplicationContext:從Web系統中的XML文件載入上下文定義信息

6、在默認情況下,Bean全都是單態,在<bean>中的singleton為false
7、<bean>中的id屬性必須遵循Java規范,而name屬性可以不遵循
8、Bean的實例化的時候需要一些初始化的動作,同樣當不再使用的時候,需要從容器中將其銷毀
9、對象的初始化:<beaninit-method="方法名">
10、對象的銷毀:<beandestroy-method="方法名">,銷毀對象的過程:

  • a、主線程先被中斷
  • b、Java虛擬機使用垃圾回收機制回收Bean對象

Spring的IoC容器就是一個實現了BeanFactory接口的可實例化類。事實上,Spring提供了兩種不同的容器:一種是最基本的BeanFactory,另一種是擴展的ApplicationContext。BeanFactory 僅提供了最基本的依賴注入支持,而 ApplicationContext 則擴展了BeanFactory ,提供了更多的額外功能。二者對Bean的初始化也有很大區別。BeanFactory當需要調用時讀取配置信息,生成某個類的實例。如果讀入的Bean配置正確,則其他的配置中有錯誤也不會影響程序的運行。而ApplicationContext 在初始化時就把 xml 的配置信息讀入內存,對 XML 文件進行檢驗,如果配置文件沒有錯誤,就創建所有的Bean ,直接為應用程序服務。相對於基本的BeanFactory,ApplicationContext 唯一的不足是占用內存空間。當應用程序配置Bean較多時,程序啟動較慢。
ApplicationContext會利用Java反射機制自動識別出配置文件中定義的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,並自動將它們注冊到應用上下文中;而BeanFactory需要在代碼中通過手工調用addBeanPostProcessor()方法進行注冊。
Bean裝配實際上就是讓容器知道程序中都有哪些Bean,可以通過以下兩種方式實現:
配置文件(最為常用,體現了依賴注入DI的思想)
編程方式(寫的過程中向BeanFactory去注冊)
作用:
1. BeanFactory負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關系,負責bean的聲明周期。
2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:
a. 國際化支持
b. 資源訪問:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
c. 事件傳遞:通過實現ApplicationContextAware接口
3. 常用的獲取ApplicationContext的方法:
FileSystemXmlApplicationContext:從文件系統或者url指定的xml配置文件創建,參數為配置文件名或文件名數組
ClassPathXmlApplicationContext:從classpath的xml配置文件創建,可以從jar包中讀取配置文件
WebApplicationContextUtils:從web應用的根目錄讀取配置文件,需要先在web.xml中配置,可以配置監聽器或者servlet來實現

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

這兩種方式都默認配置文件為web-inf/applicationContext.xml,也可使用context-param指定配置文件

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM