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. 依賴關係只能在構造器中設定,則只有組件的創建者才能改變組件的依賴關係。對組件的調用者而言,組件內部的依賴關係完全透明,更符合高內聚的原則。

  建議:採用以設值注入爲主,構造注入爲輔的注入策略。對於依賴關係無需變化的注入,儘量採用構造注入;而其他的依賴關係的注入,則考慮採用設值注入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章