在這篇中,我學習了依賴注入的兩種方式:設值注入和構造注入。
在我們以前的思維中,如果調用一個類時,我們都需要將其手動實例化,當我們創建被調用的工作不需要我們完成時,這就是控制反轉,當這個將被調用的實例過程被Spring完成,并注入調用者時,這就是依賴注入。
一、先來學習學習設值注入:
我們先來新建兩個接口規范,分別命名為Computer.java 和 Key.java,其路徑均在com.sep.basic.service包下:
Computer.java代碼如下:
1 package com.sep.basic.service;2 3 public interface Computer {4 public void useKey();5 }Key.java代碼如下:
1 package com.sep.basic.service;2 3 public interface Key {4 //一個方法5 public String print();6 }接下來寫兩個實現類,分別命名為Lenovo.java和LogiTech.java,分別實現Computer和Key接口,路徑放在com.sep.basic.service.impl包下。
Lenovo.java代碼如下:
1 package com.sep.basic.service.impl; 2 3 import com.sep.basic.service.Computer; 4 import com.sep.basic.service.Key; 5 6 public class Lenovo implements Computer{ 7 private Key key; 8 9 public Key getKey() {10 return key;11 }12 13 //設值注入所需的setter方法14 public void setKey(Key key) {15 this.key = key;16 }17 18 //實現Computer接口中使用鍵盤的屬性19 public void useKey() {20 System.out.println(key.print());21 }22 23 }LogicTech.java的代碼如下:
1 package com.sep.basic.service.impl; 2 3 import com.sep.basic.service.Key; 4 5 public class LogiTech implements Key{ 6 //實現Key接口中打印方法 7 public String print() { 8 return "用鍵盤打字"; 9 }10 11 }接下來我們配置applicationContext.xml文件,在其中加入如下代碼:
1 <!-- 將配置Lenovo實例 -->2 <bean id="lenovo" class="com.sep.basic.service.impl.Lenovo">3 <!-- 將logicTech實例注入到key屬性 -->4 <property name="key" ref="logicTech"></property>5 </bean>6 <!-- 將配置LogicTech實例 -->7 <bean id="logicTech" class="com.sep.basic.service.impl.LogicTech"></bean>
ok,接下來回到我們之前測試用的主方法,SpringTest中,在其中加入如下代碼:
//通過Spring來完成注入Lenovo lenovo = ctx.getBean("lenovo", Lenovo.class);lenovo.useKey();現在運行,可以看到控制臺輸出“用鍵盤打字”。
在applicationContext.xml中<bean>標簽中的id為bean的唯一標識,class為對應的需要實例化的類的地址。
通過寫在SpringTest中代碼可以看出我們調用的lenovo類,我們并沒有手動實例化,而且其中調用的key,我們也沒有做過多余的操作,所有的工作都是spring幫我們完成的,它通過配置文件,不僅僅創建了我們的Lenovo實例,而且將其中設值注入的key實例也幫我們建好了。
假如我們到時候需要改變key的值,我們只需要寫好對應的key的實現類,在配置文件中將
1 <!-- 將配置LogicTech實例 -->2 <bean id="logicTech" class="com.sep.basic.service.impl.LogicTech"></bean>
改為
<!-- 將配置LogicTech實例 -->7 <bean id="logicTech" class="對應的實現類全名稱"></bean>
即可。
二、我現在開始學習構造注入:
簡單從字面意思上來看,構造注入是利用構造器來完成設置依賴關系的方式。
首先我們需要對之前的Lenovo.class進行修改,修改后的代碼如下:
1 package com.sep.basic.service.impl; 2 3 import com.sep.basic.service.Computer; 4 import com.sep.basic.service.Key; 5 6 public class Lenovo implements Computer{ 7 private Key key; 8 9 //默認構造器10 public Lenovo(){};11 12 //構造注入帶參數的構造器13 public Lenovo(Key key) {14 this.key = key;15 }16 17 //設值注入所需的setter方法18 public void setKey(Key key) {19 this.key = key;20 }21 22 //實現Computer接口中使用鍵盤的屬性23 public void useKey() {24 System.out.println(key.print());25 }26 27 }同樣,配置文件需要做出對應的修改,構造注入需要使用<constructor-arg```>標簽來完成,修改后代碼如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 7 <!-- 將配置Lenovo實例 --> 8 <bean id="lenovo" class="com.sep.basic.service.impl.Lenovo"> 9 <constructor-arg ref="logicTech"></constructor-arg>10 </bean>11 <!-- 將配置LogicTech實例 -->12 <bean id="logicTech" class="com.sep.basic.service.impl.LogicTech"></bean>13 </beans>
運行,同樣可以看到語句輸出:“用鍵盤打字”。
ok,兩種方法的依賴注入我就都實現了,需要消化的東西很多啊,我還得自己琢磨琢磨,話說打這么多字很累啊,要不是最近工作不怎么忙,我估計得打字打到吐血啊!
新聞熱點
疑難解答