全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

Spring框架核心容器:BeanFactory 和ApplicationContext

更新時(shí)間:2022-05-27 來(lái)源:黑馬程序員 瀏覽量:

Spring框架的主要功能是通過(guò)其核心容器來(lái)實(shí)現(xiàn)的,因此在正式學(xué)習(xí)Spring框架的使用之前,有必要先對(duì)其核心容器有一定的了解。Spring框架提供了兩種核心容器,分別為BeanFactory和ApplicationContext。本節(jié)中將對(duì)這兩種核心容器進(jìn)行簡(jiǎn)單的介紹。

1. BeanFactory

BeanFactory由org.springframework.beans.facytory.BeanFactory 接口定義,是基礎(chǔ)類(lèi)型的loC容器(關(guān)于loC的具體含義將在本章的1.4.1小節(jié)講解,這里只需知道其表示控制反轉(zhuǎn)),它提供了完整的loC服務(wù)支持。簡(jiǎn)單來(lái)說(shuō),BeanFactory就是一個(gè)管理Bean的工廠,它主要負(fù)責(zé)初始化各種Bean,并調(diào)用它們的生命周期方法。BeanFactory 接口提供了幾個(gè)實(shí)現(xiàn)類(lèi),其中最常用的是 org.springframework.beans.factory.xml.XmlBeanFactory,該類(lèi)會(huì)根據(jù)XML配置文件中的定義來(lái)裝配Bean。創(chuàng)建BeanFactory實(shí)例時(shí),需要提供Spring所管理容器的詳細(xì)配置信息,這些信息通常采用XML文件形式來(lái)管理,其加載配置信息的語(yǔ)法如下。

BeanFactory beanFactory =
new XmlBeanFactory (new FileSystemResource("F:/applicationContext.xml"));

這種加載方式在實(shí)際開(kāi)發(fā)中并不多用,了解即可。

2. ApplicationContext

ApplicationContext是BeanFactory的子接口,也被稱(chēng)為應(yīng)用上下文,是另一種常用的Spring核心容器。它由org.springframework.context.ApplicationContext 接口定義,不僅包含了BeanFactory的所有功能,還添加了對(duì)國(guó)際化、資源訪問(wèn)、事件傳播等方面的支持。

創(chuàng)建ApplicationContext接口實(shí)例,通常采用兩種方法,具體如下。

(1)通過(guò)ClassPathXmlApplicationContext創(chuàng)建

ClassPathXmlApplicationContext會(huì)從類(lèi)路徑classPath中尋找指定的XML配置文件,找到并裝載完成ApplicationContext的實(shí)例化工作,其使用語(yǔ)法如下。

ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(String configLocation);

上述代碼中,configLocation參數(shù)用于指定Spring配置文件的名稱(chēng)和位置。如果其值為“applicationContext.xml”,則Spring會(huì)去類(lèi)路徑中查找名稱(chēng)為applicationContext.xml的配置文件。

(2)通過(guò)FileSystemXmlApplicationContext創(chuàng)建

FileSystemXmlApplicationContext會(huì)從指定的文件系統(tǒng)路徑(絕對(duì)路徑)中尋找指定的XML配置文件,找到并裝載完成ApplicationContext的實(shí)例化工作,其使用語(yǔ)法如下。

ApplicationContext applicationContext =
new FileSystemXmlApplicationContext (String configLocation);

與 ClassPathXmlApplicationContext有所不同的是,在讀取 Spring的配置文件時(shí),F(xiàn)ileSystemXmlApplicationContext不再?gòu)念?lèi)路徑中讀取配置文件,而是通過(guò)參數(shù)指定配置文件的位置,例如“D:/workspaces/applicationContext.xml”。如果在參數(shù)中寫(xiě)的不是絕對(duì)路徑,那

么方法調(diào)用的時(shí)候,會(huì)默認(rèn)用絕對(duì)路徑來(lái)找。這種采用絕對(duì)路徑的方式,會(huì)導(dǎo)致程序的靈活性變差,所以這個(gè)方法一般不推薦使用。

在使用Spring框架時(shí),可以通過(guò)實(shí)例化其中任何一個(gè)類(lèi)來(lái)創(chuàng)建ApplicationContext容器。通常在 Java 項(xiàng)目中,會(huì)采用通過(guò)ClassPathXmlApplicationContext 類(lèi)來(lái)實(shí)例化ApplicationContext容器的方式,而在Web項(xiàng)目中,ApplicationContext容器的實(shí)例化工作會(huì)交由Web 服務(wù)器來(lái)完成。Web 服務(wù)器實(shí)例化 ApplicationContext 容器時(shí),通常會(huì)使用基于ContextLoaderListener實(shí)現(xiàn)的方式,此種方式只需要在web.xml中添加如下代碼。

<!--指定Spring配置文件的位置,多個(gè)配置文件時(shí),以逗號(hào)分隔-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <!-- Spring將加載spring目錄下的applicationContext.xml文件-->
    <param-value>
        classpath:spring/applicationContext.xml
    </param-value>
</context-param>
<!--指定以ContextLoaderListener方式啟動(dòng)Spring容器-->
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

Spring獲取Bean的實(shí)例通常采用以下兩種方法。

·Object getBean(String name):根據(jù)容器中Bean的id或name來(lái)獲取指定的Bean,獲取之后需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。

·<T>T getBean(Class<T>requiredType):根據(jù)類(lèi)的類(lèi)型來(lái)獲取Bean 的實(shí)例。由于此方法為泛型方法,因此在獲取Bean之后不需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。

注意:BeanFactory和ApplicationContext兩種容器都是通過(guò)XML配置文件加載Bean的。二者的主要區(qū)別在于,如果Bean的某一個(gè)屬性沒(méi)有注入,使用BeanFacotry加載后,在第一次調(diào)用getBean(方法時(shí)會(huì)拋出異常,而ApplicationContext則在初始化時(shí)自檢,這樣有利于檢查所依賴(lài)屬性是否注入。因此,在實(shí)際開(kāi)發(fā)中,通常都優(yōu)先選擇使用ApplicationContext,而只有在系統(tǒng)資源較少時(shí),才考慮使用BeanFactory。


分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!