Spring之Bean配置

    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:指定集合元素值又是集合。

相關文章
相關標籤/搜索