Spring的核心容器
文章目錄
簡單記錄 - Java EE企業級應用開發教程(Spring+Spring MVC+MyBatis)- Spring的基本應用
Spring是作為一個容器存在的,應用中的所有組件都處於Spring的管理之下,都被Spring以Bean的方式管理。
Spring負責創建Bean的實例,並管理其生命周期。
Spring框架的主要功能是通過其核心容器來實現的。
Spring有兩個核心接口.分別為BeanFactory和ApplicationContext。
其中ApplicationContext是BeanFactory的子接口,它們都可代表Spring容器。也就是說Spring框架提供了兩種核心容器,BeanFactory和ApplicationContext。
那容器是用來干什么的?Spring容器是生成Bean的工廠,所有的組件都被當成Bean處理,例如數據源、Hibernate的SessionFactory、事務管理器等。Bean是Spring容器的基本單位。
Spring核心容器是由什么組成的?Spring的核心容器由Beans、Core、Context、SpEL等模塊組成。所有Spring的其他模塊都是建立在Core Container基礎模塊上的。該模塊規定了創建和維護Bean的方式,提供了控制反轉(IoC)和依賴注入(DI)等特性。
BeanFactory
Spring很少直接使用BeanFactory作為容器,因為在企業級的應用中大多數都會使用的是ApplicationContext,知道BeanFactory就行。
BeanFactory由org.springframework.beans.facytory.BeanFactory接口定義,是基礎類型的IoC容器(IoC控制反轉),它提供了完整的IoC服務支持。簡單來說,BeanFactory就是一個管理Bean的工廠,它主要負責初始化各種Bean,並調用它們的生命周期方法。
BeanFactory接口提供了幾個實現類,其中最常用的是org.springframework.beans. factory.xml.XmlBeanFactory,該類會根據XML配置文件中的定義來裝配Bean。
創建BeanFactory實例時,需要提供Spring所管理容器的詳細配置信息,這些信息通常采用XML文件形式來管理,其加載配置信息的語法如下。
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D:/applicationContext.xml"));
D:/applicationContext.xml 是XML配置文件的位置
這種加載方式在實際開發中並不多用,知道就行。
ApplicationContext
ApplicationContext是BeanFactory的子接口,也被稱為應用上下文,是另一種常用的Spring核心容器。它由org.springframework.context. ApplicationContext接口定義,不僅包含了BeanFactory的所有功能,還添加了對國際化、資源訪問、事件傳播等方面的支持。
ApplicationContext和BeanFacotry兩者都是用於加載Bean的,但是相比之下,Application Context提供了更多的擴展功能,簡單一點說:ApplicationContext包含BeanFactory的所有功能。通常建議比BeanFactory優先,除非在一些限制的場合,比如字節長度對內存有很大的影響時(Applet)。絕大多數企業應用和系統,都是使用ApplicationContext的。
創建ApplicationContext接口實例,通常采用兩種方法,具體如下。
1.通過ClassPathXmlApplicationContext創建
ClassPathXmlApplicationContext會從類路徑classPath中尋找指定的XML配置文件,找到並裝載完成ApplicationContext的實例化工作,其使用語法如下。
//初始化spring容器,加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(String configLocation);
//初始化spring容器,加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
上述代碼中,configLocation參數用於指定Spring配置文件的名稱和位置。如果其值為“applicationContext.xml”,則Spring會去類路徑中查找名稱為applicationContext.xml的配置文件。
就是 ClassPathXmlApplicationContext會從類路徑classPath中尋找指定的XML配置文件,找到並裝載完成ApplicationContext的實例化工作。
2.通過FileSystemXmlApplicationContext創建
FileSystemXmlApplicationContext會從指定的文件系統路徑(絕對路徑)中尋找指定的XML配置文件,找到並裝載完成ApplicationContext的實例化工作,其使用語法如下。
初始化spring容器,加載配置文件
ApplicationContext applicationContext =
new FileSystemXmlApplicationContext(String configLocation);
初始化spring容器,加載配置文件
ApplicationContext applicationContext =
new FileSystemXmlApplicationContext("applicationContext.xml");
與ClassPathXmlApplicationContext有所不同的是,在讀取Spring的配置文件時,FileSystemXmlApplicationContext不再從類路徑中讀取配置文件,而是通過參數指定配置文件的位置,例如“D:/workspaces/applicationContext.xml”。如果在參數中寫的不是絕對路徑,那么方法調用的時候,會默認用絕對路徑來找。
就是 FileSystemXmlApplicationContext會從指定的文件系統路徑(絕對路徑)中尋找指定的XML配置文件,找到並裝載完成ApplicationContext的實例化工作。
這種采用絕對路徑的方式,會導致程序的靈活性變差,所以這個方法一般不推薦使用。
在使用Spring框架時,可以通過實例化其中任何一個類來創建ApplicationContext容器。
通常在Java項目中,會采用通過ClassPathXmlApplicationContext類來實例化ApplicationContext容器的方式,而在Web項目中,ApplicationContext容器的實例化工作會交由Web服務器來完成。Web服務器實例化ApplicationContext容器時,通常會使用基於ContextLoaderListener實現的方式,此種方式只需要在web.xml中添加如下代碼。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
三大框架整合以及項目時,將采用基於ContextLoaderListener的方式由Web服務器實例化ApplicationContext容器。
創建Spring容器后,就可以獲取Spring容器中的Bean。Spring獲取Bean的實例通常采用以下兩種方法。
-
Object getBean(String name):
根據容器中Bean的id或name來獲取指定的Bean,獲取之后需要進行強制類型轉換。
-
T getBean(Class requiredType):
根據類的類型來獲取Bean的實例。由於此方法為泛型方法,因此在獲取Bean之后不需要進行強制類型轉換。
提示:BeanFactory和ApplicationContext兩種容器都是通過XML配置文件加載Bean的。二者的主要區別在於,如果Bean的某一個屬性沒有注入,使用BeanFacotry加載后,在第一次調用getBean()方法時會拋出異常,而ApplicationContext則在初始化時自檢,這樣有利於檢查所依賴屬性是否注入。因此,在實際開發中,通常都優先選擇使用ApplicationContext,而只有在系統資源較少時,才考慮使用BeanFactory。