BeanFactory 是Bean工廠,是Spring 框架最核心的接口,它提供了高級IoC 的配置機制。如果說BeanFactory是Spring的心臟,那么應用上下文ApplicationContext就是完整的軀體了,ApplicationContext繼承了BeanFactory接口,擁有BeanFactory的全部功能,擴展了更多面向實際應用的、企業級的高級特性。
它們都可以視作Spring的容器,Spring容器負責對象(Spring中我們都稱之為bean)整個生命周期的管理——實例化、裝配和銷毀 Bean。在基於Spring的Java EE應用中,所有的組件都被當成Bean處理,包括數據源,Hibernate的SessionFactory、事務管理器等。我們一般稱BeanFactory為IoC容器,而稱ApplicationContext為應用上下文。
本質區別:BeanFactory是懶加載,ApplicationContext則在初始化應用上下文時就實例化所有單實例的Bean,可以指定為延遲加載。
BeanFactory在初始化容器時,並未實例化Bean,如果Bean的某一個屬性沒有注入,BeanFacotry加載后,直至首次調用getBean方法才會拋出異常;而ApplicationContext則在初始化應用上下文時初始化所有單實例的Bean,這樣有利於檢查所依賴屬性是否已經注入。綜上所述,通常情況下我們首選ApplicationContext。
由於ApplicationContext會預先初始化所有的Singleton Bean,於是在系統創建前期會有較大的系統開銷,但一旦ApplicationContext初始化完成,程序后面獲取Singleton Bean實例時候將有較好的性能。
二者作用描述如下:
- BeanFactory負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關系,負責bean的生命周期。
- ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:
a. 國際化支持
b. 資源訪問:Resource rs = ctx. getResource(”classpath:config.properties”), “file:c:/config.properties”
c. 事件傳遞:通過實現ApplicationContextAware接口 - 常用的獲取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>