Java實例的屬性值能夠有不少種數據類型、基本類型值、字符串類型、java實例甚至其餘的Bean實例、java集合、數組等。因此Spring容許經過以下幾個元素爲Bean實例的屬性指定值:java
valuespring
ref編程
bean數組
list、set、map、propsapp
1、value:設置普通屬性值函數
<value.../>元素用於指定字符串類型、基本類型的屬性值。Spring使用XML解析器來解析出這些數據,而後利用java.beans.PropertyEdior完成類型轉換:從java.lang.String類型轉換爲所需的參數值類型。若是目標類型是基本數據類型,一般都是能夠正確轉換。this
public class ValueTest { //定義一個String型屬性 private String name; //定義一個int型屬性 private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
上面實例只是演示了注入普通屬性值。在Spring配置文件中使用<value.../>元素來爲這兩個屬性指定屬性值。spa
1 <bean id="text" class="com.spring.service.impl.ValueTest"> 2 <property name="age" value="1" /> 3 <property name="name" value="chenssy" /> 4 </bean>
經過上面能夠知道<value.../>元素主要用於傳入字符串、基本類型的屬性值。code
2、ref:配置合做者xml
<value.../>主要是配置基本類型的屬性值,可是若是咱們須要爲Bean設置屬性值是另外一個Bean實例時,這個時候須要使用<ref.../>元素。使用<ref.../>元素能夠指定以下兩個屬性。
bean:引用不在同一份XML配置文件中的其餘Bean實例的id屬性值。
local:引用同一份XML配置文件中的其餘Bean實例的id屬性值。
<bean id="steelAxe" class="com.spring.service.impl.SteelAce"></bean> <bean id="chinese" class="com.spring.service.impl.Chinese" > <property name="axe"> <ref local="steelAxe"/> </property> </bean>
或者
1 <bean id="steelAxe" class="com.spring.service.impl.SteelAce"></bean> 2 <bean id="chinese" class="com.spring.service.impl.Chinese" > 3 <property name="axe" ref="steelAxe" /> 4 </bean>
經過property增長ref屬性,同樣能夠將另外一個Bean的引用設置成axe屬性值。這樣寫的效果和使用<ref.../>屬性同樣,並且不須要區分是使用bean屬性仍是local屬性,因此推薦這種寫法。
使用自動裝配注入合做者bean
Spring支持自動裝配Bean與Bean之間的依賴關係,也就是說咱們無需顯示的指定依賴Bean。由BeanFactory檢查XML配置文件內容,根據某種規則,爲主調Bean注入依賴關係。
Spring的自動裝配機制能夠經過<bean.../>元素的default-autowire屬性指定,也能夠經過<bean.../>元素的autowire屬性指定。
自動裝配能夠減小配置文件的工做量,可是它下降了依賴關係的透明性和清晰性,因此通常來講在較大部署環境中不推薦使用,顯示配置合做者可以獲得更加清晰的依賴關係。Spring提供了以下幾種規則來實現自動裝配。
no:不適用自動裝配。Bean依賴必須經過ref元素定義。
byName:根據屬性名自動裝配。BeanFactory查找容器中的所有Bean,找出其中id屬性與屬性同名的Bean來完成注入。若是沒有找到匹配的Bean實例,則Spring不會進行任何注入。
byType:根據屬性類型自動裝配。BeanFactory查找容器中的所有Bean,若是正好有一個與依賴屬性類型相同的Bean,就自動注入這個屬性;可是若是有多個這樣的Bean,就會拋出一個異常。若是沒有匹配的Bean,則什麼都不會發生,屬性就不會被設置。若是須要沒法自動裝配時拋出異常,則設置dependency-check=」objects」。
constructor:與不Type相似,區別是用於構造注入的參數。
Autodetect:BeanFactory根據Bean內部結構,決定使用constructor或者byType。若是找到一個默認的構造函數,則使用byTe。
1.byName規則
byTyep規則是指經過名字注入依賴關係,假如Bean A的實現類裏面包含setB()方法,而Spring的配置文件剛好包含一個id爲b的Bean,則Spring容器就會將b實例注入Bean A中。若是容器中沒有名字匹配的Bean,Spring則不會作任何事情。
1 <bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byName" /> 2 <bean id="gundog" class="com.spring.service.impl.Gundog"> 3 <property name="name" value="wangwang" /> 4 </bean>
上面的配置文件指定了byName規則。則com.app.service.impl.Chinese類中提供以下的依賴注入方法:
/* * 依賴關係必須的setter方法,由於須要經過名字自動裝配 * 因此setter方法必須提供set+Bean名,Bean名的首字母大寫 * @param dog 設置的dog值 */ public void setGundog(Dog dog){ this.dog = dog; }
2.byType規則
byType規則是根據類型匹配注入依賴關係。假如A實例有setB(B b)方法,而Spring配置文件中剛好有一個類型B的Bean實例,容器爲A注入類型匹配的Bean實例。若是容器中存在多個B的實例,則會拋出異常,若是沒有B實例,則不會發生任何事情。
1 <bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byType" /> 2 <bean id="gundog" class="com.spring.service.impl.Gundog"> 3 <property name="name" value="wangwang" /> 4 </bean>
針對上面的配置文件Chinese類有以下方法。
/** * 依賴關係必須的setter方法 * 由於使用按類型自動裝配,setter方法的參數類型與容器的Bean的類型相同 * 程序中的Gundog實現了Dog接口 * @param dog傳入的dog對象 */ public void setDog(Dog dog){ this.dog = dog; }
當一個Bean即便用自動裝配依賴,又使用ref顯示依賴時,則顯示指定的依賴就會覆蓋自動裝配。
在默認的狀況下,Spring會自動搜索容器中的所有Bean,並對這些Bean進行判斷,判斷他們是否知足自動裝配的條件,若是知足就會將該Bean注入目標Bean實例中。若是咱們不想讓Spring搜索容器中的所有Bean,也就是說,咱們須要Spring來判斷哪些Bean須要搜索,哪些Bean不須要搜索,這個時候就須要用到autowire-candidate屬性。經過爲<bean.../>元素設置autowire-candidate=」false」,便可將該Bean限制在自動裝配範圍以外,容器在查找自動裝配對象時將不考慮該Bean。
3、Bean:注入嵌套Bean
若是某個Bean所依賴的Bean不想被Spring容器直接訪問,則可使用嵌套Bean。<bean.../>元素用來定義嵌套Bean,嵌套Bean只對嵌套它的外部Bean有效,Spring容器沒法直接訪問嵌套Bean,所以在定義嵌套Bean時是無需指定id屬性的。
<bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byName"> <property name="axe"> <!-- 屬性值爲嵌套Bean,嵌套Bean不能由Spring容器直接訪問, 因此嵌套Bean是不須要id屬性 --> <bean class="com.spring.service.impl.SteelAce" /> </property> </bean>
採用上面的配置能夠保證嵌套Bean不能被容器訪問,所以不用擔憂其餘程序修改嵌套bean。可是嵌套Bean限制了Bean的訪問,提升了程序的內聚性。
4、list、set、map、props
<value.../>元素是注入基本數據類型和String類型的,可是若是某個Bean的屬性是集合呢?這個時候咱們就須要使用集合元素,<list.../>、<set.../>、<map.../>和<props.../>元素分別用來設置類型list、set、map和Properties的集合屬性值。
先看下面java類:
public class Chinese implements Person{ //下面是一系列的集合屬性 private List<String> schools; private Map scores; private Map<String, Axe> phaseAxes; private Properties health; private Set axe; private String[] books; public List<String> getSchools() { return schools; } public void setSchools(List<String> schools) { this.schools = schools; } public Map getScores() { return scores; } public void setScores(Map scores) { this.scores = scores; } public Map<String, String> getPhaseAxes() { return phaseAxes; } public void setPhaseAxes(Map<String, String> phaseAxes) { this.phaseAxes = phaseAxes; } public Properties getHealth() { return health; } public void setHealth(Properties health) { this.health = health; } public Set getAxe() { return axe; } public void setAxe(Set axe) { this.axe = axe; } public String[] getBooks() { return books; } public void setBooks(String[] books) { this.books = books; } public void useAxe() { } }
上面的java代碼中有數組、list、set、,map、Properties。下面是針對上面的配置文件。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 定義一個普通的Axe Bean --> <bean id="steelAxe" class="com.spring.service.impl.SteelAxe" /> <bean id="stoneAxe" class="com.spring.service.impl.StoneAxe" /> <!--定義Chinese Bean --> <bean id="chinese" class="com.spring.service.impl.Chinese"> <property name="schools"> <list> <value>小學</value> <value>中學</value> <value>大學</value> </list> </property> <property name="scores"> <map> <entry key="語文" value="88" /> <entry key="數學" value="87" /> <entry key="外語" value="88" /> </map> </property> <property name="phaseAxes"> <map> <entry key="原始社會" value-ref="stoneAxe" /> <entry key="農業社會" value-ref="steelAxe" /> </map> </property> <property name="health"> <props> <prop key="血壓">正常</prop> <prop key="身高">175</prop> </props> </property> <property name="axe"> <set> <value>普通字符串</value> <bean class="com.spring.service.impl.SteelAxe"></bean> <ref local="stoneAxe"/> </set> </property> <property name="books"> <list> <value>java 編程思想</value> <value>思考致富</value> <value>將才</value> </list> </property> </bean> </beans>
從上面的配置文件中能夠看出,Spring對list屬性和數組屬性的處理是同樣的。
當咱們使用<list.../>、<set.../>、<map.../>等元素配置集合屬性時,咱們還須要手動配置集合元素。因爲集合元素又能夠是基本類型值、引用容器中的其餘Bean、嵌套Bean和集合屬性等。因此這些元素又能夠接受以下子元素:
value:指定集合元素是基本數據類型或者字符類型值。
ref:指定集合元素師容器中另外一個Bean實例。
bean:指定集合元素是一個嵌套Bean。
list、set、map、props:指定集合元素值又是集合。