Spring學習之路(四)


構造函數值注入

  • 步驟一:
  • 在類中指明構造函數,即含有多少參數的構造函數
  • 手動配置被覆蓋的無參構造函數,這里必須寫,因為在Spring內部set,get方法是會用到無參構造的(這里不做深入研究)
package com.constructor;
public class Employee {
    private String name;
    private int id;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Employee(String name, int id) {
        super();
        this.name = name;
        this.id = id;
    }
//含有兩個參數的構造函數
    public Employee() {     
    }
//前面自定義的構造函數覆蓋了默認的構造函數,所以手動添加無參構造函數
}
  • 步驟二:
  • 配置構造函數
<bean id="employee" class="com.constructor.Employee" >
<!-- 通過構造函數注入值 -->
<constructor-arg index="0" type="java.lang.String" value="小紅"  />
<constructor-arg index="1" type="int" value="1"  />
</bean>
  • 說明:使用constructor-arg屬性引入構造函數,其中index代表參數位置,type代表參數類型;順序要匹配,且容器調用時會先掃描匹配再實例化并賦值。

自動裝配

自動裝配
  • 解釋:在配置文件中并沒有強制配置bean之間的依賴關系,而采用系統(tǒng)自動配置的方式(上述5種)。這里引入兩個類說明Dog,Master
    Dog:
package com.autoaware;
public class Dog {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Master:

package com.autoaware;
public class Master {
    private String name;
    private Dog dog;
    public Dog getDog() {
        return dog;
    }
    public void setDog(Dog dog) {
        this.dog = dog;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
  • 傳統(tǒng)配置:
<bean id="master" class="com.autoaware.Master"  >
    <property name="name">
        <value>小紅</value>
    </property>
<!--這里寫明了強制依賴關系-->
    <property name="dog">
        <ref>dog</ref>
    </property>
</bean>
<bean id="dog" class="com.autoaware.Dog" >
    <property name="name" value="小狗" ></property>
</bean>
  • 自動裝配:
    引入屬性autowire由系統(tǒng)進行自動裝配。
  • byName根據屬性名匹配bean。
<!--該屬性會讓系統(tǒng)根據Master類中定義的Dog名字dog去自動匹配bean,若不存在則報錯-->
<bean id="master" class="com.autoaware.Master" autowire="byName" >
    <property name="name">
        <value>小紅</value>
    </property>
</bean>
*  byType根據屬性類型匹配bean。
<!--該屬性會讓系統(tǒng)根據Master類中定義的Dog類去自動匹配bean,若不存在或存在多個均報錯-->
<bean id="master" class="com.autoaware.Master" autowire="byType" >
    <property name="name">
        <value>小紅</value>
    </property>
</bean>
*  constructor根據源碼構造函數匹配bean。
<!--該屬性會讓系統(tǒng)根據Master類中是否存在含Dog參數的構造函數,來決定是否報錯-->
<bean id="master" class="com.autoaware.Master" autowire="constructor" >
    <property name="name">
        <value>小紅</value>
    </property>
</bean>

Master中加入構造函數

public Master(Dog dog) {
        this.dog = dog;
    }
//必須是該屬性參數的構造參數
*  no沒有指定,不與Dog發(fā)生關聯,屬性至空。
<!--該屬性會讓系統(tǒng)根據Master類中定義的Dog名字dog去自動匹配bean,若不存在則報錯-->
<bean id="master" class="com.autoaware.Master" autowire="no" >
    <property name="name">
        <value>小紅</value>
    </property>
</bean>
*  autodetect通過byType或者constructor自動裝配,constructor優(yōu)先級較高。
<!--該屬性會讓系統(tǒng)根據Master類中定義的Dog名字dog去自動匹配bean,若不存在則報錯-->
<bean id="master" class="com.autoaware.Master" autowire="autodetect" >
    <property name="name">
        <value>小紅</value>
    </property>
</bean>

另外,手動配置級別比自動裝配高,如果手動裝配則不會報錯,同時,當為申明該屬性值時,該值為系統(tǒng)默認值,而系統(tǒng)默認值是在beans標簽下配置的,默認為no(不是說不寫就是no,而是未設置系統(tǒng)默認,傳承過來才是no)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容