spring的兩種依賴注入方式:setter注入與構造方法注入.
這兩種方法的不同主要就是在xml檔案下對應使用property和constructor-arg屬性,
如下圖:
//其中name的值為原類中的屬性名
property屬性:<property name="id" value="123"></property>
//其中index的值為0~n-1,n代表構造函數中的輸入參數的數量
constructor-arg屬性:<constructor-arg index="0" value="456"></constructor-arg>
執行個體示範:
1.setter方法注入
setter方法注入即是建立一個普通的JavaBean類,為需要注入的屬性通過對應的setter方法即可,如:
(1)建立一個Id類:隻有set與get方法
package com.loster.li;
public class Id {
private int id;
private String name;
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;
}
}
(2)建立配置檔案Id_Bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
//settet方法注入
<bean id="id" class="com.loster.li.Id">
<property name="id" value="123"></property>
<property name="name" value="xiaoli"></property>
</bean>
</beans>
(3)編寫測試類IdTest.java,并運作:
package com.loster.li;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class IdTest {
public static void main(String[] args){
ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("com/loster/li/Id_Bean.xml");
Id id = (Id)context.getBean("id");
System.out.println(id.getId()); //123
System.out.println(id.getName()); //xiaoli
}
}
2.構造方法注入
2.構造方法注入
(1)給ID類建立有參構造方法:
package com.loster.li;
public class Id {
private int id;
private String name;
//有參構造方法
public Id(int id,String name){
this.id = id;
this.name = name;
}
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;
}
}
(2)将上面的Id_Bean.xml修改為:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
//構造方法注入
<bean id="id" class="com.loster.li.Id">
<constructor-arg index="0" value="456"></constructor-arg>
<constructor-arg index="1" value="dawang"></constructor-arg>
</bean>
</beans>
(3)再次運作IdTest.java,運作結果如下:
package com.loster.li;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class IdTest {
public static void main(String[] args){
ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("com/loster/li/Id_Bean.xml");
Id id = (Id)context.getBean("id");
System.out.println(id.getId()); //123
System.out.println(id.getName()); //xiaoli
}
}
那麼,這兩種注入方式有和差別呢?下面做簡單比較:
設值注入(setter注入):
- 設值注入需要該Bean包含這些屬性的setter方法
- 與傳統的JavaBean的寫法更相似,程式開發人員更容易了解、接收。通過setter方法設定依賴關系顯得更加隻管。
- 對于複雜的依賴關系,如果采用構造注入,會導緻構造器國語臃腫,難以閱讀。Spring在建立Bean執行個體時,需要同時執行個體化器依賴的全部執行個體,因而導緻性能下降。而使用設值注入,則能避免這些問題
- 尤其是在某些屬性可選的情況況下,多參數的構造器顯得更加笨重
構造注入:
- 構造注入需要該Bean包含帶有這些屬性的構造器
- 構造注入可以在構造器中決定依賴關系的注入順序,優先依賴的優先注入。例如,元件中其他依賴關系的注入,常常要依賴于DataSrouce的注入。采用構造注入,可以在代碼中清晰的決定注入順序。
- 對于依賴關系無需變化的Bean,構造注入更有用處。因為沒有Setter方法,所有的依賴關系全部在構造器内設定。是以,無需擔心後續的代碼對依賴關系産生破壞。
- 依賴關系隻能在構造器中設定,則隻有元件的建立者才能改變元件的依賴關系。對元件的調用者而言,元件内部的依賴關系完全透明,更符合高内聚的原則。