在Spring框架中,依賴注入(DI)的設計模式是用來定義物件彼此間的依賴。它主要有兩種型別:
1. Setter方法注入
這是最流行最簡單的DI注入方法,通過設定方法注入依賴。
範例
幫助器類和指定的setter方法
package com.yiibai.output;
import com.yiibai.output.IOutputGenerator;
public class OutputHelper
{
IOutputGenerator outputGenerator;
public void setOutputGenerator(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
一個 bean 組態檔案用來宣告bean 和通過 setter 設定注入(property標籤)的依賴。
<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="OutputHelper" class="com.yiibai.output.OutputHelper">
<property name="outputGenerator">
<ref bean="CsvOutputGenerator" />
</property>
</bean>
<bean id="CsvOutputGenerator" class="com.yiibai.output.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.yiibai.output.impl.JsonOutputGenerator" />
</beans>
只需注入一個「CsvOutputGenerator」 bean 到 「OutputHelper」物件,通過一個 setter 方法(setOutputGenerator)。
2.建構函式注入
此DI方法將通過建構函式注入依賴。
範例
一個輔助類別建構函式。
package com.yiibai.output;
import com.yiibai.output.IOutputGenerator;
public class OutputHelper
{
IOutputGenerator outputGenerator;
OutputHelper(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
bean 組態檔案來宣告bean並通過建構函式(constructor-arg標籤)設定注入依賴。
<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="OutputHelper" class="com.yiibai.output.OutputHelper">
<constructor-arg>
<bean class="com.yiibai.output.impl.CsvOutputGenerator" />
</constructor-arg>
</bean>
<bean id="CsvOutputGenerator" class="com.yiibai.output.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.yiibai.output.impl.JsonOutputGenerator" />
</beans>
只需通過一個建構函式注入一個 「CsvOutputGenerator」 Bean 到 「OutputHelper」 物件。
setter方法還是建構函式注入?
Spring框架的設定有沒有硬性規定,只需要使用適合你的專案需要的型別注入。然而,由於setter方法注入簡單,它總是大部分使用場景的選擇。
參考
1. http://en.wikipedia.org/wiki/Dependency_injection