在我們經(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)造方法丝里,兩個對象分別是:djNewsListener
和djNewsPersister
曲初。其中的<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
蕾各、parent
和bean
屬性來指定引用的對象的beanName
是什么。示例如下:
constructor-arg>
<ref local="djNewsPersister"/>
</constructor-arg>
或者
<constructor-arg>
<ref parent="djNewsPersister"/>
</constructor-arg>
或者
<constructor-arg>
<ref bean="djNewsPersister"/>
</constructor-arg>
local
庆揪、parent
和bean
的區(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)容砌滞。