第2章-Spring基于XML配置的容器

Spring 的核心功能就是提供一個(gè) IoC 容器后控,用于管理應(yīng)用程序中的 bean禾锤,在容器中配置元數(shù)據(jù)來(lái)管理 Bean 之間的依賴關(guān)系膏燃,Java 程序中的類都可以交由 Spring 容器管理削樊。

一滥搭、Bean 管理

1. 元數(shù)據(jù)

配置 Spring 元數(shù)據(jù)的方式有三種:

  • 基于 XML 方式配置
  • 基于注解方式配置
  • 基于 Java 方式配置

Spring 最早的時(shí)候提供BeanFactory接口實(shí)現(xiàn) Bean 容器酸纲,而后面新增的許多功能都是基于其子接口ApplicationContext來(lái)實(shí)現(xiàn)的,前面說(shuō)的三種配置方式瑟匆,可以使用下面三個(gè)實(shí)現(xiàn)類來(lái)實(shí)例化容器闽坡。

|interface BeanFactory (org.springframework.beans.factory)
|---interface ApplicationContext (org.springframework.context)
|---|---class FileSystemXmlApplicationContext (org.springframework.context.support)
|---|---class ClassPathXmlApplicationContext (org.springframework.context.support)
|---|---class AnnotationConfigApplicationContext (org.springframework.context.annotation)

例如使用 ClassPathXmlApplicationContext 來(lái)通過(guò) classpath 目錄下的配置文件實(shí)例化容器:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");

2. Bean 實(shí)例化

在 Spring 容器中配置好的 Bean 都會(huì)被 Spring 自動(dòng)實(shí)例化,以供在開(kāi)發(fā)過(guò)程中注入直接可以使用愁溜,而不需要手動(dòng)去 new 對(duì)象疾嗅。

2.1 構(gòu)造器實(shí)例化

Spring 容器默認(rèn)使用類的無(wú)參構(gòu)造器來(lái)實(shí)例化 Bean,也可以指定其他帶參數(shù)的構(gòu)造器來(lái)實(shí)例化冕象。

<!--默認(rèn)使用無(wú)參構(gòu)造器-->
<bean id="beanProvider" class="cn.codeartist.spring.bean.xml.BeanProvider"/>

<!--使用其他構(gòu)造器-->
<bean id="beanExample" class="cn.codeartist.spring.bean.xml.BeanExample">
    <constructor-arg index="0" value="碼匠公眾號(hào)"/>
    <constructor-arg index="1" value="2021"/>
    <constructor-arg index="2" ref="beanProvider"/>
</bean>

2.2 靜態(tài)工廠方式實(shí)例化

Spring 容器支持使用靜態(tài)工廠方法來(lái)實(shí)例化 Bean,在類中定義一個(gè) static 方法來(lái)創(chuàng)建對(duì)象實(shí)例。

public class BeanExample {
    
    private static BeanExample beanExample = new BeanExample();

    public static BeanExample getInstance() {
        return beanExample;
    }
}

在 Bean 配置中使用 factory-method 屬性來(lái)指定工廠方法晒杈。

<bean id="beanExample" class="...xml.BeanExample" factory-method="getInstance"/>

2.3 實(shí)例工廠方式實(shí)例化

和靜態(tài)工廠方法一樣,不同的是工廠方法是實(shí)例化后的 Bean 的方法而不是靜態(tài)方法掖棉。

public class BeanExampleFactory {
    
    private static BeanExample beanExample = new BeanExample();

    public BeanExample getInstance() {
        return beanExample;
    }
}

在 Bean 配置中使用 factory-bean 屬性指定工廠類的 Bean,使用 factory-method 屬性來(lái)指定工廠方法膀估。

<bean id="beanExample" class="...xml.BeanExample" factory-bean="beanExampleFactory" factory-method="getInstance"/>
<bean id="beanExampleFactory" class="cn.codeartist.spring.bean.xml.BeanExampleFactory"/>

3. Bean 作用域

通過(guò) scope 屬性配置 bean 的作用域幔亥,來(lái)指定 bean 的實(shí)例化作用范圍。

<bean id="beanExample" class="...xml.BeanExample" scope="prototype"/>

常用的幾種 Bean 作用域如下:

作用域 描述
singleton (默認(rèn))單例作用域玖像,在 Spring 容器內(nèi)部只創(chuàng)建一個(gè)實(shí)例
prototype 原型作用域紫谷,在容器中創(chuàng)建多個(gè)實(shí)例,每使用一次創(chuàng)建一個(gè)實(shí)例
request 請(qǐng)求作用域捐寥,在 Web 框架下單次請(qǐng)求創(chuàng)建一個(gè)實(shí)例
session 會(huì)話作用域笤昨,在 Web 框架下單次會(huì)話內(nèi)創(chuàng)建一個(gè)實(shí)例
application 應(yīng)用作用域,在 ServletContext 生命周期內(nèi)創(chuàng)建一個(gè)實(shí)例

二握恳、依賴注入

Spring 容器創(chuàng)建好了 Bean 實(shí)例后瞒窒,會(huì)根據(jù)實(shí)例間的依賴關(guān)系來(lái)進(jìn)行注入。

1. 依賴注入

1.1 構(gòu)造器注入

通過(guò)類的構(gòu)造器來(lái)注入依賴的值或 Bean乡洼。

<bean id="beanExample" class="...xml.BeanExample">
    <constructor-arg index="0" value="碼匠公眾號(hào)"/>
    <constructor-arg index="1" value="2021"/>
    <constructor-arg index="2" ref="beanProvider"/>
</bean>

1.2 Setter 方法注入

通過(guò)類的 Setter 方法注入依賴的值或 Bean崇裁。

<bean id="beanExample" class="...xml.BeanExample">
    <property name="name" value="碼匠公眾號(hào)"/>
    <property name="year" value="2021"/>
    <property name="beanProvider" ref="beanProvider"/>
</bean>

在兩種注入方式中,配置值的方式:

  • value:注入值
  • ref:注入引用(注入 Bean 實(shí)例)

2. 依賴關(guān)系

一般情況下束昵,Bean 之間的依賴關(guān)系并不明確拔稳,但在一些情況下,比如初始化一個(gè)靜態(tài)類锹雏,使用 depends-on 屬性指定在初始化該 bean 之前巴比,強(qiáng)制初始化依賴的一個(gè)或多個(gè) bean。

<bean id="beanExample" class="...xml.BeanExample" depends-on="beanProvider" />

3. 懶加載

一般情況下礁遵,Spring 會(huì)在容器啟動(dòng)的時(shí)候把所有 Bean 實(shí)例化完成轻绞,如果想在第一次使用的 Bean 的時(shí)候才初始化,可能配置 lazy-init 來(lái)實(shí)現(xiàn)佣耐。

<bean id="beanExample" class="...xml.BeanExample" lazy-init="true"/>

4. 自動(dòng)注入

Spring 容器支持自動(dòng)注入政勃,而不需要手動(dòng)通過(guò) ref 來(lái)指定依賴的 bean 實(shí)例。

<bean id="beanExample" class="...xml.BeanExample" autowire="byName"/>

容器支持的注入方式:

注入方式 描述
no (默認(rèn))不使用自動(dòng)注入
byName 通過(guò) bean 名稱注入
byType 通過(guò) bean 類型注入
constructor 通過(guò)構(gòu)造器參數(shù)類型注入

三兼砖、附錄

1. 配置屬性表

屬性 默認(rèn)值 描述
id - 指定 bean 的名稱
class - 指定 bean 的類
scope singleton 指定作用域
depends-on - 指定依賴關(guān)系
lazy-init false 配置懶加載
autowire no 配置自動(dòng)注入
factory-bean - 指定提供工廠方法的 bean
factory-method - 指定創(chuàng)建 bean 的工廠方法

2. 示例代碼

Gitee 倉(cāng)庫(kù):https://gitee.com/code_artist/spring

代碼目錄:src/main/java/cn/codeartist/spring/bean/xml

獲取最新教程關(guān)注碼匠公眾號(hào):CodeArtist

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奸远,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子讽挟,更是在濱河造成了極大的恐慌然走,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戏挡,死亡現(xiàn)場(chǎng)離奇詭異芍瑞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)褐墅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門拆檬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洪己,“玉大人,你說(shuō)我怎么就攤上這事竟贯〈鸩叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵屑那,是天一觀的道長(zhǎng)拱镐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)持际,這世上最難降的妖魔是什么沃琅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蜘欲,結(jié)果婚禮上益眉,老公的妹妹穿的比我還像新娘。我一直安慰自己姥份,他們只是感情好郭脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著澈歉,像睡著了一般展鸡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埃难,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天娱颊,我揣著相機(jī)與錄音,去河邊找鬼凯砍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拴竹,可吹牛的內(nèi)容都是我干的悟衩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼栓拜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼座泳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起幕与,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挑势,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后啦鸣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體潮饱,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年诫给,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了香拉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啦扬。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凫碌,靈堂內(nèi)的尸體忽然破棺而出扑毡,到底是詐尸還是另有隱情,我是刑警寧澤盛险,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布瞄摊,位于F島的核電站,受9級(jí)特大地震影響苦掘,放射性物質(zhì)發(fā)生泄漏换帜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一鸟蜡、第九天 我趴在偏房一處隱蔽的房頂上張望膜赃。 院中可真熱鬧,春花似錦揉忘、人聲如沸跳座。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疲眷。三九已至,卻和暖如春您朽,著一層夾襖步出監(jiān)牢的瞬間狂丝,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工哗总, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留几颜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓讯屈,卻偏偏與公主長(zhǎng)得像蛋哭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涮母,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355