天天看點

spring的三種注入方式詳解

1.    接口注入(不推薦)

2.    getter,setter方式注入(比較常用)

3.    構造器注入(死的應用)

關于getter和setter方式的注入

  1. autowire="defualt" 
  2. autowire=“byName”  
  3. autowire="bytype" 

詳細解析注入方式

例如:有如下兩個類需要注入

第一個類:

  1. package org.jia;  
  2.   public class Order {  
  3.       private String orderNum;  
  4.       @SuppressWarnings("unused")  
  5.       private OrderItem orderitem;  
  6.       public OrderItem getOrderitem() {  
  7.           return orderitem;  
  8.      }  
  9.      public void setOrderitem(OrderItem orderitem) {  
  10.          this.orderitem = orderitem;  
  11.      }  
  12.      public String getOrderNum() {  
  13.          return orderNum;  
  14.      }  
  15.      public void setOrderNum(String orderNum) {  
  16.          this.orderNum = orderNum;  
  17.      }       
  18.  }  

第二個類:

  1. package org.jia;  
  2.  public class OrderItem {  
  3.      private String orderdec;  
  4.      public String getOrderdec() {  
  5.          return orderdec;  
  6.      }  
  7.      public void setOrderdec(String orderdec) {  
  8.          this.orderdec = orderdec;  
  9.      }  
  10.  }  

常用getter&&setter方式介紹

方式第一種注入:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
  3. <beans> 
  4.     <bean id="orderItem" class="org.jia.OrderItem"> 
  5.         <property name="orderdec" value="item00001"></property> 
  6.     </bean> 
  7.     <bean id="order" class="org.jia.Order" > 
  8.         <!-----注入變量 名字必須與類中的名字一樣-------> 
  9.         <property name="orderNum" value="order000007"></property> 
  10.          <!--注入對象 名字為orderitem,所屬的類的應用id為orderItem--> 
  11.         <property name="orderitem" ref="orderItem"></property> 
  12.     --></bean> 
  13. </beans> 

方式第二種注入:byName

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.     <!--此時的id就必須與Order.java中所定義的OrderItem的對象名稱一樣了,不然就會找不到-->  
  5.     <bean id="orderitem" class="org.jia.OrderItem">  
  6.         <property name="orderdec" value="item00001"></property>  
  7.     </bean>  
  8.     <bean id="order" class="org.jia.Order"<span style="color:#ff0000;"> autowire="byName"</span>>  
  9.         <property name="orderNum" value="order000007"></property>  
  10.     </bean>  
  11. </beans> 

方式第三種注入:byType

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.     <!--按照byType注入則就與id沒有關系,可以随便定義id !!!但是不能出現多個此類的id-->  
  5.     <bean id="orderitdfadafaem" class="org.jia.OrderItem">  
  6.         <property name="orderdec" value="item00001"></property>  
  7.     </bean>  
  8.     <bean id="order" class="org.jia.Order" <span style="color:#ff0000;">autowire="byType"</span>>  
  9.         <property name="orderNum" value="order000007"></property>  
  10.     </bean>  
  11. </beans> 

autowire="constructor"

需要在Order.java中加入一個構造器

  1. public Order(OrderItem item )  
  2. {   
  3.       orderitem = item;  

XML配置檔案

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
  3. <beans> 
  4.     <bean id="orderItem" class="org.jia.OrderItem"> 
  5.         <property name="orderdec" value="item00001"></property> 
  6.     </bean> 
  7.     <bean id="order" class="org.jia.Order" autowire="constructor"> 
  8.         <property name="orderNum" value="order000007"></property> 
  9.     </bean> 
  10. </beans> 

三種注入方式比較

接口注入:

接口注入模式因為具備侵入性,它要求元件必須與特定的接口相關聯,是以并不被看好,實際使用有限。

Setter 注入:

對于習慣了傳統 javabean 開發的程式員,通過 setter 方法設定依賴關系更加直覺。

如果依賴關系較為複雜,那麼構造子注入模式的構造函數也會相當龐大,而此時設值注入模式則更為簡潔。

如果用到了第三方類庫,可能要求我們的元件提供一個預設的構造函數,此時構造子注入模式也不适用。

構造器注入:

在構造期間完成一個完整的、合法的對象。

所有依賴關系在構造函數中集中呈現。

依賴關系在構造時由容器一次性設定,元件被建立之後一直處于相對“不變”的穩定狀态。

隻有元件的建立者關心其内部依賴關系,對調用者而言,該依賴關系處于“黑盒”之中。

總結

Spring使用注入方式,為什麼使用注入方式,這系列問題實際歸結起來就是一句話,Spring的注入和IoC(本人關于IoC的闡述)反轉控制是一回事。

理論上:第三種注入方式(構造函數注入)在符合java使用原則上更加合理,第二種注入方式(setter注入)作為補充。

實際上:我個人認為第二種注入方式(setter注入)可以取得更加直覺的效果,在使用工作上有不可比拟的優勢,是以setter注入依賴關系應用更加廣泛。

參考部落格:http://www.blogjava.net/jiadong/archive/2007/08/29/140962.html

原文連結:http://blog.csdn.net/qiulongtianshi/article/details/7748227