在實際環境中實現IoC容器的方式主要分為兩大類,一類是依賴查找,依賴查找是通過資源定位,把對應的資源查找回來;另一類則是依賴注入,而Spring主要使用的是依賴注入。一般而言,依賴注入可以分為3種方式。
•構造器注入。
•setter注入。
•接口注入。
構造器注入和setter注入是主要的方式,而接口注入是從別的地方注入的方式,比如在Web工程中,配置的數據源往往是通過服務器(比如Tomcat)去配置的,這個時候可以用JNDI的形式通過接口將它注入Spring IoC容器中來。下面對它們進行詳細講解。
構造器注入
構造器注入依賴於構造方法實現,而構造方法可以是有參數的或者是無參數的。在大部分的情況下,我們都是通過類的構造方法來創建類對象,Spring也可以采用反射的方式,通過使用構造方法來完成注入,這就是構造器注入的原理。
public class Role { private Long id; private String roleName; private String note; public Role(String roleName, String note) { this.roleName = roleName; this.note = note; } /******** setter and getter *******/ }
這個時候是沒有辦法利用無參數的構造方法去創建對象的,為了使Spring能夠正確創建這個對象,可以像代碼清單那樣去做。
<bean id="role1" class="com.ssm.chapter9.pojo.Role"> <constructor-arg index="0" value="總經理"/> <constructor-arg index="1" value="公司管理者"/> </bean>
constructorarg元素用於定義類構造方法的參數,其中index用於定義參數的位置,而value則是設置值,通過這樣的定義Spring便知道使用Role(String,String)這樣的構造方法去創建對象了。這樣注入還是比較簡單的,但是缺點也很明顯,由於這里的參數比較少,所以可讀性還是不錯的,但是如果參數很多,那么這種構造方法就比較復雜了,這個時候應該考慮setter注入。
使用setter注入
setter注入是Spring中最主流的注入方式,它利用JavaBean規范所定義的setter方法來完成注入,靈活且可讀性高。它消除了使用構造器注入時出現多個參數的可能性,首先可以把構造方法聲明為無參數的,然后使用setter注入為其設置對應的值,其實也是通過Java反射技術得以現實的。這里假設先在代碼清單中為Role類加入一個沒有參數的構造方法,然后做代碼清單的配置。
<bean id="role2" class="com.ssm.chapter9.pojo.Role"> <property name="roleName" value="高級工程師"/> <property name="note" value="重要人員"/> </bean
這樣Spring就會通過反射調用沒有參數的構造方法生成對象,同時通過反射對應的setter注入配置的值了。這種方式是Spring最為主要的方式,在實際工作中使用廣泛。
接口注入
有些時候資源並非來自於自身系統,而是來自於外界,比如數據庫連接資源完全可以在Tomcat下配置,然后通過JNDI的形式去獲取它,這樣數據庫連接資源是屬於開發工程外的資源,這個時候我們可以采用接口注入的形式來獲取它
