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ì)象引用就可以了氯质。
- local 只能指定與當(dāng)前配置的對(duì)象在同一個(gè)配置文件的對(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初始化行為施以更多控制