1. 程式人生 > >Spring 依賴注入的兩種方式

Spring 依賴注入的兩種方式

依賴注入是Spring IoC容器實現反轉控制的方式,Spring的IoC容器以依賴注入的方式實現了Bean物件之間關聯關係的維護。

Spring的IoC容器實現了兩種方式的物件注入,一種是構造方法,一種是setter方法。

基於構造方法的依賴注入

基於構造方法的依賴注入是通過呼叫帶引數的構造器來實現的,每個引數代表著一個此物件的依賴者。

ConstructInjectionBean.java

public class ConstructInjectionBean {
	private AnotherBean anotherBean;
	private YetAnotherBean yetAnotherBean;
	private int i;
	
	public ConstructInjectionBean(AnotherBean anotherBean,YetAnotherBean yetAnotherBean,int i){
		this.anotherBean = anotherBean;
		this.yetAnotherBean = yetAnotherBean;
		this.i = i;
	}
}
配置Bean
        <bean id="anotherBean" class="com.hd.injection.AnotherBean" />
 	<bean id="yetAnotherBean" class="com.hd.injection.YetAnotherBean" />
 	<bean id="constructInjectionBean" class="com.hd.injection.ConstructInjectionBean">
 	    <!-- 使用<ref>元素來指定被注入的引數 -->
 	    <constructor-arg>
 	        <ref bean="anotherBean"/>
 	    </constructor-arg>
 	    <!-- 使用ref屬性來指定被注入的引數 -->
 	    <constructor-arg ref="yetAnotherBean" />
 	    <!-- 直接定義常量來作為被注入的引數  -->
 	    <constructor-arg type="int" value="1" />
 	</bean>
以上配置檔案類似於如下Java程式碼:
                AnotherBean anotherBean = new AnotherBean();
		YetAnotherBean yetAnotherBean = new YetAnotherBean();
		ConstructInjectionBean constructInjectionBean = new ConstructInjectionBean(anotherBean, yetAnotherBean, 1);
在使用基於構造方法的依賴注入時,Bean類中構造方法的引數與XML配置檔案中的配置元素應該是一一對應的。


基於setter方法的依賴注入

在使用基於setter方法的依賴注入時,需要首先通過呼叫無參構造器或無參靜態工廠方法例項化Bean之後,再呼叫該Bean的setter方法,這樣就可以實現基於setter的依賴注入了。

SetterInjectionBean.java

public class SetterInjectionBean {
	private AnotherBean anotherBean;
	private YetAnotherBean yetAnotherBean;
	private int i;
	
	public AnotherBean getAnotherBean() {
		return anotherBean;
	}

	public void setAnotherBean(AnotherBean anotherBean) {
		this.anotherBean = anotherBean;
	}

	public YetAnotherBean getYetAnotherBean() {
		return yetAnotherBean;
	}

	public void setYetAnotherBean(YetAnotherBean yetAnotherBean) {
		this.yetAnotherBean = yetAnotherBean;
	}

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}
}
配置Bean
 	<bean id="anotherBean" class="com.hd.injection.AnotherBean" />
 	<bean id="yetAnotherBean" class="com.hd.injection.YetAnotherBean" />
 	<bean id="setterInjectionBean" class="com.hd.injection.SetterInjectionBean">
 	  	<!-- 通過<ref> 元素實現setter方式的依賴注入的配置  -->
 	  	<property name="anotherBean">
 	  	    <ref bean="anotherBean"/>
 	  	</property>
 	  	<!-- 通過ref屬性來實現setter方式的依賴注入的配置  -->
 	  	<property name="yetAnotherBean" ref="yetAnohterBean"></property>
 	  	<!-- 通過value屬性來直接定義注入的值 -->
 	  	<property name="i" value="1"></property>
 	</bean>
以上配置檔案類似如下Java程式碼:
		AnotherBean anotherBean = new AnotherBean();
		YetAnotherBean yetAnotherBean = new YetAnotherBean();
		int i = 1;
		SetterInjectionBean setterInjectionBean = new SetterInjectionBean();
		setterInjectionBean.setAnotherBean(anotherBean);
		setterInjectionBean.setYetAnotherBean(yetAnotherBean);
		setterInjectionBean.setI(i);
使用setter方法來實現依賴注入的時候,Bean類中的setter方法與xml檔案中配置的屬性是一一對應的。

兩種依賴注入方式的比較:

使用構造方法實現依賴注入時可以一次性完成物件的建立和依賴關係的設定,保證是在完全初始化的基礎上將物件的例項返回給客戶的。更重要的是,採用構造方法實現的依賴注入不能再進行重新注入。而使用setter方法實現的依賴注入在需要的時候還可以進行重新注入。

使用構造方法實現依賴注入還有一個缺點,就是在屬性很多的情況下,構造方法會過於複雜和龐大。因此靈活性會比較差。因此在實際開發中,一般使用基於setter方法的依賴注入。