構造函數值注入
- 步驟一:
- 在類中指明構造函數,即含有多少參數的構造函數
- 手動配置被覆蓋的無參構造函數,這里必須寫,因為在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)。