在實際環境中實現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可以正確建立這個對象,能夠像代碼清單那樣去作。this
<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注入。spa
setter注入是Spring中最主流的注入方式,它利用JavaBean規範所定義的setter方法來完成注入,靈活且可讀性高。它消除了使用構造器注入時出現多個參數的可能性,首先能夠把構造方法聲明爲無參數的,而後使用setter注入爲其設置對應的值,其實也是經過Java反射技術得以現實的。這裏假設先在代碼清單中爲Role類加入一個沒有參數的構造方法,而後作代碼清單的配置。code
<bean id="role2" class="com.ssm.chapter9.pojo.Role"> <property name="roleName" value="高級工程師"/> <property name="note" value="重要人員"/> </bean
這樣Spring就會經過反射調用沒有參數的構造方法生成對象,同時經過反射對應的setter注入配置的值了。這種方式是Spring最爲主要的方式,在實際工做中使用普遍。對象
有些時候資源並不是來自於自身系統,而是來自於外界,好比數據庫鏈接資源徹底能夠在Tomcat下配置,而後經過JNDI的形式去獲取它,這樣數據庫鏈接資源是屬於開發工程外的資源,這個時候咱們能夠採用接口注入的形式來獲取它blog