1. 程式人生 > >Spring 依賴注入(DI)示例

Spring 依賴注入(DI)示例

依賴注入

依賴注入是為了解決緊耦合問題而產生的一種技術,緊耦合的程式碼難以測試、難以複用、難以理解,當程式出現bug時,修復bug經常會產生連鎖反應,但是,一定程度的耦合又是必須的,完全沒有耦合的程式碼什麼也做不了。所以一種比較好的方案就是,將依賴關係交給第三方元件來描述。
通過DI,物件的依賴關係將有系統中負責協調各物件的第三方元件在建立物件的時候設定。例如,在Spring中可以通過編寫XML來描述這種關係。

示例(構造器注入)

程式清單

  1. Knight.java – 介面
  2. Quest.java – 介面
  3. BraveKnight.java – 類
  4. SlayDragonQuest.java – 類
  5. KnightMain.java – 程式入口
  6. springContext.xml --描述依賴關係的配置檔案

Knight.java

public interface Knight {
	/**
	 * 執行請求
	 */
	public void embarkOnQuest();
}

Quest.java

public interface Quest {
	
	/**
	 * 執行
	 */
	void embark();

}

BraveKnight.java

public class BraveKnight implements Knight{
	// 請求介面--泛指某一種請求
	private Quest quest;
	
	/**
	 * 有參構造器 -- 在構造物件的時候將某種請求傳遞過來,
	 * 這裡就是一個典型的構造器注入示例
	 * @param quest
	 */
	public BraveKnight(Quest quest){
		this.quest = quest;
	}
	/**
	 * 根據請求的響應動作
	 */
	public void embarkOnQuest(){
		quest.embark();
	}
}

SlayDragonQuest.java

public class SlayDragonQuest implements Quest{
	private PrintStream stream;
	
	/**
	 * 有參構造器 -- 與BraveKnight類似也是通過構造器來注入的
	 * @param stream
	 */
	public SlayDragonQuest(PrintStream stream){
		this.stream = stream;
	}

	/**
	 * 執行的動作
	 */
	@Override
	public void embark() {
		stream.println("Embarking on quest to slay the dragon!");
	}
	
}

依賴關係的配置
springContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
    <bean id = "kight" class = "com.css.test.spring.BraveKnight">
    	<constructor-arg ref = "quest" />
    </bean>
    
    <bean id = "quest" class = "com.css.test.spring.SlayDragonQuest">
    	<constructor-arg value="#{T(System).out}"/>
    </bean>
</beans>

注:我這裡所有的類都放在了com.css.test.spring的包下了,這個路徑可以根據喜好任意指定
KnightMain.java

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class KnightMain {
	/**
	 * 程式入口
	 * @param args
	 */
	public static void main(String[] args) {
		// 讀取配置檔案,從而獲得依賴關係
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springContext.xml");
		// 通過配置檔案配置的依賴關係,構造一個knight的物件
		Knight knight = context.getBean(Knight.class);
		// 執行方法
		knight.embarkOnQuest();
		// 關閉context
		context.close();
	}
}

測試

執行KnightMain類,可以獲得如下結果。
在這裡插入圖片描述

注意事項

如果在讀取配置檔案的時候直接使用相對路徑不能讀取到檔案可以在BuildPath配置一下相關依賴關係
在這裡插入圖片描述
然後將配置檔案所在的資料夾新增過來eclipse就可以找到了。