基於構造函數的依賴注入
我們知道,bean標簽中指定的類會進行初始化,這個初始化過程中自然會調用構造函數,那我們也可以利用這個構造函數完成依賴注入。
先創建一個類:
public class TextEditor { public TextEditor(SpellChecker spellChecker) { System.out.println("TextEditor的構造函數"); } public TextEditor(String s) { System.out.println(s); } }
如上,可以看見有兩個構造函數。
第一個構造函數的參數是自定義類型,第二個是一個字符串類型。兩種不同的參數類型在配置文件中的寫法是不一樣的,下面會提到。
再創建一個測試類:
public class MainApps { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); TextEditor editor = (TextEditor) context.getBean("text"); } }
配置文件內容如下:
<bean id="text" class="Dependency.injection.TextEditor"> <constructor-arg type="java.lang.String" value="這是一個構造函數注入的值"/> </bean>
配置文件中,除了常見的bean標簽,需要使用constructor-arg標簽來完成構造函數的注入。
運行測試類輸出:
這是一個構造函數注入的值
如果向調用上面一個構造函數,配置文件內容如下:
<bean id="text" class="Dependency.injection.TextEditor"> <constructor-arg ref="spellChecker"/> </bean> <bean id="spellChecker" class="Dependency.injection.SpellChecker"/>
注意:
1.如果你需要傳遞一個對象的引用,就直接用ref;如果你需要傳遞一個java自帶的數據類型,則需要先在type里聲明類型,再用value設置值。
2.如果構造參數的參數列表有多個參數,則傳遞的順序就是參數列表的順序。
基於設值函數的依賴注入
通過bean調用設值函數來完成依賴注入。
先准備一個類:
public class TextEditor { private String name; //設值函數 public void setName(String name) { this.name = name; } public void getName() { System.out.println(this.name); } }
注意私有屬性name,下面會通過bean設置這個屬性的值。
再准備一個測試類:
public class MainApps { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); TextEditor editor = (TextEditor) context.getBean("text"); editor.getName(); } }
配置文件內容如下:
<bean id="text" class="Dependency.injection.TextEditor"> <property name="name" value="李四"/> </bean>
運行測試類輸出:
李四
注意:
1.設值函數也可以傳遞引用,同樣使用ref。
2.配置文件中,設值函數用的是property。構造函數注入用的是constructor-arg