細說Spring——IoC詳解(XML配置一)

在我們經(jīng)過了:

的學(xué)習(xí)之后,已經(jīng)對Spring的Ioc容器有了一定的了解咱台,我們隊容器如何創(chuàng)建對象有了細致的了解奶卓,接下來就是一些其他零零散散的東西键思,這一期就主要講解Spring IoC容器的XML配置文件小腊。

一、我們應(yīng)該怎么理解和認識Spring的配置文件呢?

其實届搁,Spring的配置文件是Spring容器對Bean進行生產(chǎn)以及關(guān)系注入的圖紙,他是Spring的基礎(chǔ)模燥。如果我們沒有配置文件的話咖祭,則Spring的容器將無從談起。

Spring 的配置文件是用于指導(dǎo) Spring 工廠進行 Bean 的生產(chǎn)蔫骂、依賴關(guān)系注入及 Bean 實例分發(fā)的“圖紙”么翰, J2EE 程序員必須學(xué)會并靈活應(yīng)用這份“圖紙”,準確地表達自己的“生產(chǎn)意圖”辽旋。它是一個或多個標準的XML文檔浩嫌,其ApplicationContext.xml是Spring的默認配置文件,當(dāng)容器啟動時找不到其他的配置文件時补胚,則會嘗試加載這個默認的配置文件码耐。

Spring容器成功啟動需要以下三方面的條件同時具備:

  • Spring的類包必須已經(jīng)放在Spring的類容器下面
  • 應(yīng)用程序應(yīng)當(dāng)為Spring提供完備的Bean的配置信息
  • Bean的類都已經(jīng)放在Spring的類容器下面

Spring啟動時讀取應(yīng)用程序提供的Bean的配置信息,并在Spring容器中生成一份相應(yīng)的Bean的配置注冊表溶其,然后根據(jù)這張注冊表來實例化Bean骚腥,裝配好Bean之間的依賴關(guān)系,為上層應(yīng)用提供準備就緒的運行環(huán)境瓶逃。
而bean的配置信息就是Bean的元數(shù)據(jù)信息束铭,他由以下五個方面來組成:

  • Bean的實現(xiàn)類
  • Bean的屬性信息 比如:數(shù)據(jù)源的連接數(shù),用戶名和密碼等等厢绝。
  • Bean的依賴關(guān)系 Spring根據(jù)依賴關(guān)系配置完成Bean之間的裝配
  • Bean的行為配置 比如:生命周期范圍以及生命周期各個過程的回調(diào)函數(shù)等
  • Bean的創(chuàng)建方式定義 主要說明是通過構(gòu)造器還是工廠方法來構(gòu)造Bean

接下來是他們之間的相互關(guān)系:

這里寫圖片描述

上面這些信息引用自:Spring學(xué)習(xí)(十二)Spring 的配置文件概述

二契沫、從<beans>標簽開始

在我們知道了Spring的配置文件是什么之后,我們就開始自頂向下的逐步講解Spring的配置文件中的標簽昔汉,為什么要從<beans>標簽開始呢懈万,因為我們每一個類對應(yīng)到配置文件中都是一個<bean>標簽,而多個<bean>標簽j就組成了<beans><beans>是XML配置文件中最頂層的元素会通,它下面可以包含0或者1個<description>和多個<bean>以及<import>或者<alias>口予,如圖所示:

這里寫圖片描述

<beans>標簽可以通過相應(yīng)的屬性對<bean>進行統(tǒng)一的默認行為配置,他的屬性有一下幾個:

  • default-lazy-init涕侈。其值可以指定為true或者false苹威,默認值為false。用來標志是否對所
    有的<bean>進行延遲初始化驾凶。
  • default-autowire≈佬铮可以取值為no调违、byName、byType泻轰、constructor以及autodetect技肩。默
    認值為no,如果使用自動綁定的話浮声,用來標志全體bean使用哪一種默認綁定方式虚婿。
  • default-dependency-check∮净樱可以取值none然痊、objects、simple以及all屉符,默認值為none剧浸,
    即不做依賴檢查。
  • default-init-method矗钟。如果所管轄的<bean>按照某種規(guī)則唆香,都有同樣名稱的初始化方法的
    話,可以在這里統(tǒng)一指定這個初始化方法名吨艇,而不用在每一個<bean>上都重復(fù)單獨指定躬它。
  • default-destroy-method。與default-init-method相對應(yīng)东涡,如果所管轄的bean有按照某種
    規(guī)則使用了相同名稱的對象銷毀方法冯吓,可以通過這個屬性統(tǒng)一指定。

三软啼、<description>桑谍、<import><alias>

1、<description>
可以通過<description>在配置的文件中指定一些描述性的信息祸挪。通常情況下锣披,該元素是省略的。當(dāng)然,如果愿意雹仿,<description>隨時可以為我們效勞增热。

2、<import>
通常情況下胧辽,可以根據(jù)模塊功能或者層次關(guān)系峻仇,將配置信息分門別類地放到多個配置文件中。在想加載主要配置文件邑商,并將主要配置文件所依賴的配置文件同時加載時摄咆,可以在這個主要的配置文件中通過<import>元素對其所依賴的配置文件進行引用。比如人断,如果A.xml中的<bean>定義可能依賴B.xml中的某些<bean>定義吭从,那么就可以在A.xml中使用<import>B.xml引入到A.xml小染,以類似于<import resource="B.xml"/>的形式芋绸。但是戳稽,這個功能價值不大枪孩,因為容器實際上可以同時加載多個配置今穿,沒有必要非通過一 個配置文件來加載所有配置久妆。不過卡乾,或許在有些場景中使用這種方式比較方便也說不定酣胀。

3奈附、<alias> 可以通過<alias>為某些<bean>起一些“外號”(別名)全度,通常情況下是為了減少輸入。比如斥滤,假設(shè)有個<bean>讼载,它的名稱為dataSourceForMasterDatabase,你可以為其添加一個<alias>中跌,像這樣<alias name="dataSourceForMasterDatabase" alias="masterDataSource"/>咨堤。以后通過dataSourceForMasterDatabase或者masterDataSource來引用這個<bean>都可以,只要你覺得方便就行漩符。

四一喘、最重要的<bean>標簽

首先我們來看一下如何定義一個<bean>標簽:

<bean id="djNewsListener" class="..impl.DowJonesNewsListener">
</bean> 

然后我們就來學(xué)習(xí)一下<bean>標簽中的屬性:
1、id屬性:我們通過id屬性來作為唯一標識嗜暴,也就是起一個名字凸克,相當(dāng)于這個<bean>的名字。id的命名規(guī)則:

  • 遵循XML命名規(guī)范
  • 由字母闷沥,數(shù)字萎战,下劃線組成
  • 駝峰式,首個單詞字母小寫舆逃,從第二個單詞開始首字母大寫蚂维。

2戳粒、name屬性:是不是有點糊涂了,既然有name屬性虫啥,我們?yōu)樯哆€要id屬性蔚约,其實name屬性基本已經(jīng)不用了,所以我們通過id來當(dāng)做名字就可以了涂籽。
3苹祟、class屬性:每個注冊到容器的對象都需要通過<bean>元素的class屬性指定其類型,否則评雌,容器可不知道這個對象到底是何方神圣树枫。在大部分情況下,該屬性是必須的景东。

五团赏、<bean>標簽下的子標簽

1、<constructor-arg>:我們可以通過這個標簽進行依賴對象的構(gòu)造器注入耐薯,示例如下:
<bean id="djNewsProvider" class="..FXNewsProvider">
     <constructor-arg>
         <ref bean="djNewsListener"/>
     </constructor-arg>
     <constructor-arg>
         <ref bean="djNewsPersister"/>
     </constructor-arg>
</bean> 

從這個實例中我們可以看出djNewsProvider這個bean中有兩個依賴對象,和以這兩個依賴對象為參數(shù)的構(gòu)造方法丝里,兩個對象分別是:djNewsListenerdjNewsPersister曲初。其中的<ref>標簽我們馬上講解。

<constructor-arg>標簽中有兩個屬性:

  • type屬性:假如一個類中有兩個構(gòu)造方法杯聚,那么我們就可以使用type屬性來指定調(diào)用構(gòu)造方法的參數(shù)類型臼婆,這樣就可以按照自己的喜好來指定構(gòu)造方法。示例如下:
<bean id="mockBO" class="..MockBusinessObject">
     <constructor-arg type="int">
         <value>111111</value>
     </constructor-arg>
</bean> 

這里指定調(diào)用了構(gòu)造器參數(shù)為int類型的構(gòu)造器幌绍。

  • index屬性:當(dāng)當(dāng)前<bean>對象的構(gòu)造器有多個相同參數(shù)的構(gòu)造方法時颁褂,我們就可以是有index標簽來指定構(gòu)造器方法的參數(shù)順序。示例如下:
<bean id="mockBO" class="..MockBusinessObject">
     <constructor-arg index="1" value="11111"/>
     <constructor-arg index="0" value="22222"/>
</bean> 

這里我們就指定了第一個參數(shù)的值為22222傀广,第二個參數(shù)的值為11111颁独。

2、<property>:我們可以通過這個標簽來進行setter方法的依賴注入伪冰,示例如下:
<bean id="djNewsProvider" class="..FXNewsProvider"> 2
     <property name="newsListener">
         <ref bean="djNewsListener"/>
    </property>
     <property name="newPersistener">
         <ref bean="djNewsPersister"/>
     </property>
</bean>

這里的一個<property>就對應(yīng)一個屬性的setter方法誓酒。

<property>標簽有一個name屬性,用來指定當(dāng)前對象的屬性名稱贮聂。

六靠柑、<property><constructor-arg>下的子標簽

1、<value>

可以通過<value>為主體對象注入簡單的數(shù)據(jù)類型吓懈,不但可以指定String類型的數(shù)據(jù)歼冰,而且可以指定其他Java語言中的原始類型以及它們的包裝器(wrapper)類型,比如int耻警、Integer等隔嫡。容器在注入的時候甸怕,會做適當(dāng)?shù)霓D(zhuǎn)換工作(我們其實已經(jīng)知道做這個工作的就是PropertyEditor)
我們可以通過以下兩種用法來使用<value>標簽:

第一種
<constructor-arg>
     <value>111111</value>
</constructor-arg>
<property name="attributeName">
     <value>222222</value>
</property> 
第二種
<constructor-arg value="111111"/>
<property name="attributeName" value="222222"/> 
2、<ref>

使用<ref>來引用容器中其他的對象實例畔勤,可以通過<ref>local蕾各、parentbean屬性來指定引用的對象的beanName是什么。示例如下:

constructor-arg>
     <ref local="djNewsPersister"/>
</constructor-arg>
或者
<constructor-arg>
     <ref parent="djNewsPersister"/>
</constructor-arg>
或者
<constructor-arg>
     <ref bean="djNewsPersister"/>
</constructor-arg> 

local庆揪、parentbean的區(qū)別在于:

  • local只能指定與當(dāng)前配置的對象在同一個配置文件的對象定義的名稱(可以獲得XML解析器的id約束驗證支持
  • parent則只能指定位于當(dāng)前容器的父容器中定義的對象引用
  • bean則基本上通吃式曲,所以,通常情況下缸榛,直接使用bean來指定對象引用就可以了
3吝羞、<idref>

<idref>我可以獲取spring容器中的bean的name的值(一個字符串),而不是bean的實例内颗。
<idref>元素的功能與<value>類似钧排,就是<idref>多了驗證的功能,減少配置的書寫錯誤機率均澳。
總之就是一句話恨溜,在我們需要spring容器中的bean的name的值時,使用<idref>標簽找前。

4糟袁、內(nèi)部<bean>

使用<ref>可以引用容器中獨立定義的對象定義。但有時躺盛,可能我們所依賴的對象只有當(dāng)前一個對象引用项戴,或者某個對象定義我們不想其他對象通過<ref>引用到它。這時槽惫,我們可以使用內(nèi)嵌的<bean>周叮,將這個私有的對象定義僅局限在當(dāng)前對象。示例如下:

<bean id="djNewsProvider" class="..FXNewsProvider">
     <constructor-arg index="0">
         <bean class="..impl.DowJonesNewsListener">
     </bean>
     </constructor-arg> 
     <constructor-arg index="1">
         <ref bean="djNewsPersister"/>
     </constructor-arg>
</bean> 
5界斜、<list>仿耽、 <set><map>

這三個標簽我們一看就能知道他們對應(yīng)的是集合類型的參數(shù)各薇。這里就不多舉例子了氓仲,如果有疑問可以參考:Spring學(xué)習(xí)筆記(一)——IOC

6、<props>

<props>是簡化后了的<map>得糜,該元素對應(yīng)配置類型為java.util.Properties的對象依賴敬扛。因為Properties只能指定String類型的鍵(key)和值,所以朝抖,<props>的配置簡化很多啥箭,示例如下:

<property name="valueSet">
     <props>
         <prop key="author">fujohnwang@gmail.com</prop>
         <prop key="support">support@spring21.cn</prop>
         ...
     </props>
</property> 

感覺內(nèi)容實在太多了,這一次就到這里吧治宣,接下來的一起急侥,將會詳細講解<bean>中的屬性和其他的一些內(nèi)容砌滞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坏怪,隨后出現(xiàn)的幾起案子贝润,更是在濱河造成了極大的恐慌,老刑警劉巖铝宵,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件打掘,死亡現(xiàn)場離奇詭異,居然都是意外死亡鹏秋,警方通過查閱死者的電腦和手機尊蚁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侣夷,“玉大人横朋,你說我怎么就攤上這事“偻兀” “怎么了琴锭?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衙传。 經(jīng)常有香客問我决帖,道長,這世上最難降的妖魔是什么粪牲? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮止剖,結(jié)果婚禮上腺阳,老公的妹妹穿的比我還像新娘。我一直安慰自己穿香,他們只是感情好亭引,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皮获,像睡著了一般焙蚓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洒宝,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天购公,我揣著相機與錄音,去河邊找鬼雁歌。 笑死宏浩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靠瞎。 我是一名探鬼主播比庄,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼求妹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佳窑?” 一聲冷哼從身側(cè)響起制恍,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎神凑,沒想到半個月后净神,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡耙厚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年强挫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薛躬。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡俯渤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出型宝,到底是詐尸還是另有隱情八匠,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布趴酣,位于F島的核電站梨树,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岖寞。R本人自食惡果不足惜抡四,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仗谆。 院中可真熱鬧指巡,春花似錦、人聲如沸隶垮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狸吞。三九已至勉耀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹋偏,已是汗流浹背便斥。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留威始,地道東北人椭住。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像字逗,于是被迫代替她去往敵國和親京郑。 傳聞我的和親對象是個殘疾皇子宅广,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)些举,斷路器跟狱,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,717評論 2 22
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評論 6 342
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架户魏,建立于...
    Hsinwong閱讀 22,409評論 1 92
  • 把事情做好的前提不是一個人有多能耐驶臊,而是需要你的團隊互相之間默契的配合,協(xié)作的重要性不單體現(xiàn)在工作中叼丑,婚姻亦然关翎。 ...
    8ab1b259aed0閱讀 426評論 0 3