Spring揭秘-xml配置文件的說(shuō)明

Spring BeanFactory的xml配置文件的說(shuō)明

  • spring2.0之前使用DTD文檔聲明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ?
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
...
</beans>
  • spring2.0以后在向前兼容的前提下又引入了XML Schema的文檔聲明
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
...
</beans>
  • <beans> 是XML配置文件中最頂層的元素, 它下面可以包含0或者1個(gè) <description> 和多個(gè)<bean> 以及 <import> 或者 <alias>


    Paste_Image.png

<beans>標(biāo)簽的默認(rèn)屬性

  • default-lazy-init 秘噪。true 或 false ,默認(rèn)值為 false 。用來(lái)標(biāo)志是否對(duì)所有的 <bean> 進(jìn)行延遲初始化草则。
  • default-autowire 奕塑。取值為 no 浊猾、 byName 、 byType 、 constructor 以及 autodetect 傻谁。默認(rèn)值為 no ,如果使用自動(dòng)綁定的話,用來(lái)標(biāo)志全體bean使用哪一種默認(rèn)綁定方式。
  • default-dependency-check 媳否≌っ可以取值 none 、 objects 篱竭、 simple 以及 all ,默認(rèn)值為 none ,即不做依賴檢查力图。
  • default-init-method 。如果 <bean> 按照某種規(guī)則,都有同樣名稱的初始化方法的話,可以在這里統(tǒng)一指定這個(gè)初始化方法名,而不用在每一個(gè) <bean> 上都重復(fù)單獨(dú)指定掺逼。
  • default-destroy-method 吃媒。 與 default-init-method 相對(duì)應(yīng),如果所管轄的bean有按照某種規(guī)則使用了相同名稱的對(duì)象銷毀方法,可以通過(guò)這個(gè)屬性統(tǒng)一指定。

<description> 吕喘、 <import> 和 <alias>

  • 這三個(gè)標(biāo)簽不是必須的
  • <description>配置文件的描述信息
  • <import resource="B.xml"/>在本配置文件中導(dǎo)入其他配置文件
  • 可以通過(guò) <alias> 為某些 <bean> 起一些“外號(hào)”(別名)

構(gòu)造方法注入

<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg type="int"> <!--查找參數(shù)類型為int的構(gòu)造方法-->
<value>111111</value>
</constructor-arg>
< /bean>
<bean id="mockBO" class="..MockBusinessObject">
  <constructor-arg index="1" value="11111"/> <!-- index代表構(gòu)造方法參數(shù)所以位置 -->
  <constructor-arg index="0" value="22222"/>
</bean>

setter方式注入

  • <property> 有一個(gè) name 屬性, 用來(lái)指定該 <property> 將會(huì)注入的對(duì)象所對(duì)應(yīng)的實(shí)例變量名稱
<bean id="djNewsProvider" class="..FXNewsProvider">
  <property name="newsListener">
    <ref bean="djNewsListener"/>
  </property>
  <property name="newPersistener">
    <ref bean="djNewsPersister"/>
  </property>
< /bean>

<property> 和 <constructor-arg> 中可用的配置項(xiàng)

  • <value> 可以通過(guò) value 為主體對(duì)象注入簡(jiǎn)單的數(shù)據(jù)類型
<constructor-arg>
  <value>111111</value>
</constructor-arg>
<property name="attributeName">
  <value>222222</value>
</property>

等效于

<constructor-arg value="111111"/>
<property name="attributeName" value="222222"/>
  • <ref> 赘那。使用 ref 來(lái)引用容器中其他的對(duì)象實(shí)例,可以通過(guò) ref 的 local 、 parent 和 bean 屬性來(lái)指定引用的對(duì)象的 beanName 是什么
    • local 只能指定與當(dāng)前配置的對(duì)象在同一個(gè)配置文件的對(duì)象定義的名稱
      (可以獲得XML解析器的 id 約束驗(yàn)證支持)
    • parent 則只能指定位于當(dāng)前容器的父容器中定義的對(duì)象引用;

      a
      Paste_Image.png
    • bean 則基本上通吃,所以,通常情況下,直接使用bean來(lái)指定對(duì)象引用就可以了氯质。
<constructor-arg>
  <ref local="djNewsPersister"/>
</constructor-arg>
或者
<constructor-arg>
  <ref parent="djNewsPersister"/>
</constructor-arg>
或者
<constructor-arg>
  <ref bean="djNewsPersister"/>
</constructor-arg>
  • <idref>, 容器在解析配置的時(shí)候就可以幫你檢查這個(gè) beanName 到底是否存在,而不用等到運(yùn)行時(shí)才發(fā)現(xiàn)這個(gè) beanName 對(duì)應(yīng)的對(duì)象實(shí)例不存在
<property name="newsListenerBeanName">
  <idref bean="djNewsListener"/>
</property>
  • 內(nèi)部 <bean>
<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg index="0">
  <!--內(nèi)部bean作用域只可以被djNewsProvider引用, 其他bean無(wú)法引用該對(duì)象 -->
  <bean class="..impl.DowJonesNewsListener">
</bean>
</constructor-arg>
<constructor-arg index="1">
  <ref bean="djNewsPersister"/>
</constructor-arg>
< /bean>
  • <list> 募舟。 <list> 對(duì)應(yīng)注入對(duì)象類型為 java.util.List 及其子類或者數(shù)組類型的依賴對(duì)象。
public class MockDemoObject
{
  private List param1;
  private String[] param2;
  ...
  // 相應(yīng)的setter和getter方法
  ...
}
配置類似于
<property name="param1">
  <list>
    <value> something</value>
    <ref bean="someBeanName"/>
    <bean class="..."/>
  </list>
</property>
<property name="param2">
  <list>
    <value>stringValue1</value>
    <value>stringValue2</value>
  </list>
</property>
  • <set> 對(duì)應(yīng)注入Java Collection中類型為 java.util.Set 或者其子類的依賴對(duì)象
public class MockDemoObject
{
private Set valueSet;
// 必要的setter和getter方法
...
}
配置類似于
<property name="valueSet">
  <set>
    <value> something</value>
    <ref bean="someBeanName"/>
    <bean class="..."/>
    <list>
    ...
    </list>
  </set>
</property>
  • <map> 對(duì)應(yīng)注入 java.util.Map 或者其子類類型的依賴對(duì)象
public class MockDemoObject
{
private Map mapping;
// 必要的setter和getter方法
...
}
配置類似于
<property name="mapping">
  <map>
    <entry key="strValueKey">
      <value>something</value>
    </entry>
    <entry>
      <key>objectKey</key>
      <ref bean="someObject"/>
    </entry>
    <entry key-ref="lstKey">
      <list>
        ...
      </list>
    </entry>
     ...
  </map>
< /property>

等效于

public class MockDemoObject
{
private Map mapping;
// 必要的setter和getter方法
...
}
配置類似于
<property name="valueSet">
  <map>
    <entry key="strValueKey" value="something"/>
    <entry key-ref="" value-ref="someObject"/>
    <entry key-ref="lstKey">
    <list>
      ...
    </list>
    </entry>
    ...
  </map>
</property>
  • <props> 闻察。 <props> 是簡(jiǎn)化后了的 <map> ,或者說(shuō)是特殊化的 map ,該元素對(duì)應(yīng)配置類型為java.util.Properties 的對(duì)象依賴拱礁。因?yàn)?Properties 只能指定 String 類型的鍵(key)和值,所以,<props> 的配置簡(jiǎn)化很多
public class MockDemoObject
{
  private Properties emailAddrs;
  // 必要的setter和getter方法
...
}
配置類似于
<property name="valueSet">
  <props>
    <prop key="author">fujohnwang@gmail.com</prop>
    <prop key="support">support@spring21.cn</prop>
    ...
  </props>
</property>
  • <null/> 一個(gè)空元素, 對(duì)于 String 類型來(lái)說(shuō),如果通過(guò)value以這樣的方式指定注入,即 <value></value> ,那么,得到的結(jié)果是 "" ,而不是 null, 所以,如果需要為這個(gè)string對(duì)應(yīng)的值入 null 的話,請(qǐng)使用 <null/>
public class MockDemoObject
{
  private String param1;
  private Object param2;
  // 必要的setter和getter方法
  ...
}
配置為
<property name="param1">
  <null/>
</property>
<property name="param2">
  <null/>
</property>
實(shí)際上就相當(dāng)于
public class MockDemoObject
{
  private String param1=null;
  private Object param2=null;
  // 必要的setter和getter方法
  ...
}

depends-on

  • 前置依賴bean, 將configSetup,configSetup2,...等多個(gè)bean在ClassA實(shí)例之前實(shí)例
  • depends-on用來(lái)指定Bean初始化及銷毀時(shí)的順序
<bean id="classAInstance" class="...ClassA" depends-on="configSetup,configSetup2,..."/>
<bean id="configSetup" class="SystemConfigurationSetup"/>
<bean id="configSetup2" class="SystemConfigurationSetup2"/>

autowire自動(dòng)綁定

public class Foo
{
  private Bar emphasisAttribute;
...
// 相應(yīng)的setter方法定義
}
public class Bar
{
  ...
}
那 么應(yīng)該使用如下代碼所演示的自動(dòng)綁定定義,才能達(dá)到預(yù)期的目的:
<bean id="fooBean" class="...Foo" autowire="byName">
</bean>
<bean id="emphasisAttribute" class="...Bar">
</bean>
  • byName: 按照類中聲明的實(shí)例變量的名稱,與XML配置文件中聲明的bean定義的 beanName 的值進(jìn)行匹配相匹配的bean定義將被自動(dòng)綁定到當(dāng)前實(shí)例變量上.
  • byType: byType根據(jù)其他bean的類型和當(dāng)前bean屬性的類型進(jìn)行自動(dòng)裝配,若IOC容器中有一個(gè)以上的類型匹配的bean,則拋異常
  • constructor: constructor 類型則是針對(duì)構(gòu)造方法參數(shù)的類型而進(jìn)行的自動(dòng)綁定, 功能與byType類似
public class Foo
{
  private Bar bar;
  public Foo(Bar arg)
  {
    this.bar = arg;
  }
  ...
}
相應(yīng)配置為
<bean id="foo" class="...Foo" autowire="constructor"/>
<bean id="bar" class="...Bar">
< /bean>
  • autodetect: 這種模式是 byType 和 constructor 模式的結(jié)合體,如果對(duì)象擁有默認(rèn)無(wú)參數(shù)的構(gòu)造方法,容器會(huì)
    優(yōu)先考慮 byType 的自動(dòng)綁定模式辕漂。否則,會(huì)使用 constructor 模式


    Paste_Image.png
  • 如果想讓系統(tǒng)中所有的 <bean> 定義都使用 byType 模式的自動(dòng)綁定,我們可以使用

<beans default-autowire="byType">
<bean id="..." class="..."/>
...
</beans>

lazy-init

  • 主要是可以針對(duì) ApplicationContext 容器的bean初始化行為施以更多控制
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呢灶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钉嘹,更是在濱河造成了極大的恐慌鸯乃,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跋涣,死亡現(xiàn)場(chǎng)離奇詭異缨睡,居然都是意外死亡鸟悴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門宏蛉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遣臼,“玉大人,你說(shuō)我怎么就攤上這事拾并∽嵫撸” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嗅义,是天一觀的道長(zhǎng)屏歹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)之碗,這世上最難降的妖魔是什么蝙眶? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮褪那,結(jié)果婚禮上幽纷,老公的妹妹穿的比我還像新娘。我一直安慰自己博敬,他們只是感情好友浸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偏窝,像睡著了一般收恢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祭往,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天伦意,我揣著相機(jī)與錄音,去河邊找鬼硼补。 笑死驮肉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的已骇。 我是一名探鬼主播缆八,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疾捍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起栏妖,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乱豆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吊趾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宛裕,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑟啃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揩尸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛹屿。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岩榆,靈堂內(nèi)的尸體忽然破棺而出错负,到底是詐尸還是另有隱情,我是刑警寧澤勇边,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布犹撒,位于F島的核電站,受9級(jí)特大地震影響粒褒,放射性物質(zhì)發(fā)生泄漏识颊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一奕坟、第九天 我趴在偏房一處隱蔽的房頂上張望祥款。 院中可真熱鬧,春花似錦月杉、人聲如沸刃跛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奠伪。三九已至,卻和暖如春首懈,著一層夾襖步出監(jiān)牢的瞬間绊率,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工究履, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滤否,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓最仑,卻偏偏與公主長(zhǎng)得像藐俺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泥彤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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