天天看點

Spring的兩種依賴注入方式:setter方法注入與構造方法注入以及兩種方式的差別!

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.構造方法注入

(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注入):

  1. 設值注入需要該Bean包含這些屬性的setter方法
  2. 與傳統的JavaBean的寫法更相似,程式開發人員更容易了解、接收。通過setter方法設定依賴關系顯得更加隻管。
  3. 對于複雜的依賴關系,如果采用構造注入,會導緻構造器國語臃腫,難以閱讀。Spring在建立Bean執行個體時,需要同時執行個體化器依賴的全部執行個體,因而導緻性能下降。而使用設值注入,則能避免這些問題
  4. 尤其是在某些屬性可選的情況況下,多參數的構造器顯得更加笨重

  構造注入:

  1. 構造注入需要該Bean包含帶有這些屬性的構造器
  2. 構造注入可以在構造器中決定依賴關系的注入順序,優先依賴的優先注入。例如,元件中其他依賴關系的注入,常常要依賴于DataSrouce的注入。采用構造注入,可以在代碼中清晰的決定注入順序。
  3. 對于依賴關系無需變化的Bean,構造注入更有用處。因為沒有Setter方法,所有的依賴關系全部在構造器内設定。是以,無需擔心後續的代碼對依賴關系産生破壞。
  4. 依賴關系隻能在構造器中設定,則隻有元件的建立者才能改變元件的依賴關系。對元件的調用者而言,元件内部的依賴關系完全透明,更符合高内聚的原則。

  建議:采用以設值注入為主,構造注入為輔的注入政策。對于依賴關系無需變化的注入,盡量采用構造注入;而其他的依賴關系的注入,則考慮采用設值注入。