在Spring框架中,依賴注入(DI)的設計模式是用來定義對象彼此間的依賴。它主要有兩種類型:
- Setter方法注入
-
構造器注入
1. Setter方法注入
這是最流行最簡單的DI注入方法,通過設置方法注入依賴。
示例
幫助器類和指定的setter方法
package com.zaixian.output; import com.zaixian.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.zaixian.output.OutputHelper"> <property name="outputGenerator"> <ref bean="CsvOutputGenerator" /> </property> </bean> <bean id="CsvOutputGenerator" class="com.zaixian.output.impl.CsvOutputGenerator" /> <bean id="JsonOutputGenerator" class="com.zaixian.output.impl.JsonOutputGenerator" /> </beans>
只需注入一個“CsvOutputGenerator” bean 到 “OutputHelper”對象,通過一個 setter 方法(setOutputGenerator)。
2.構造函數注入
此DI方法將通過構造函數注入依賴。
示例
一個輔助類的構造函數。
package com.zaixian.output; import com.zaixian.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.zaixian.output.OutputHelper"> <constructor-arg> <bean class="com.zaixian.output.impl.CsvOutputGenerator" /> </constructor-arg> </bean> <bean id="CsvOutputGenerator" class="com.zaixian.output.impl.CsvOutputGenerator" /> <bean id="JsonOutputGenerator" class="com.zaixian.output.impl.JsonOutputGenerator" /> </beans>
只需通過一個構造函數注入一個 “CsvOutputGenerator” Bean 到 “OutputHelper” 對象。
setter方法還是構造函數注入?
Spring框架的設置有沒有硬性規定,只需要使用適合你的專案需要的類型注入。然而,由於setter方法注入簡單,它總是大部分使用場景的選擇。