java框架學習日誌-5(常見的依賴注入)
阿新 • • 發佈:2018-12-14
依賴注入(dependency injection)
之前提到控制反轉(Inversion of Control)也叫依賴注入,它們其實是一個東西,只是看的角度不同,這章詳細說一下依賴注入。
依賴——指bean物件建立依賴於容器,bean物件依賴於資源(物件,常量,變數等)。
注入——bean物件依賴的資源通過容器來設定和裝配(裝配是指,比如一個物件A,需要一個物件B的例項,spring在配置物件A的時候,需要傳入物件B的一個例項。會檢查有沒有有B,有的話,就拿來用,或者在配置物件其他屬性時,傳值的一個過程,叫裝配)。
本章主要補充之前沒有用到的注入方式,和總結學過的注入。
spring注入
常見的注入有下面這幾種。p空間注入(spring2開始支援的注入,為了減少太多property引起的尖括號,需要在標頭檔案中新增xmlns:p=" http://www.springframework.org/schema/p", 如果報錯點選File——Settings——Schemas and DTD,點加號,新增進去)
c空間注入(也是建構函式注入,和p空間注入用法一樣,就沒有寫例子了),構造器注入,常量注入,陣列注入,list注入,map注入,set注入,null注入,properties注入,bean注入。為了理解,以遊戲為例,我們建立一個英雄。然後每種注入都用一次來配置。程式碼如下
目錄
Hero程式碼
package cn.dota2.hero; import cn.dota2.tpye.Type; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class Hero { public void setLv(String lv) { this.lv = lv; } public void setExp(String exp) { this.exp = exp; } private String name;//英雄姓名,通過構造器注入 private int hp,mp;//生命值,魔法值,通過常量注入 private Type hero_type;//肉盾型別。通過bean注入 private String[] article;//英雄持有物品,通過陣列注入 private List<String> skill;//技能,通過list注入 private Map<String,String> buff;//英雄狀態,String為名字,int為持續時間,通過map注入 private Set<String> group;//隊友,通過set注入 private String gold;//金錢,NULL注入 private Properties cool_down;//技能cd。通過Properties注入 private String lv,exp;//等級,經驗值。通過p空間注入 /** * 構造器注入 * @param name 英雄姓名 */ public Hero(String name){ this.name=name; } /**set方法**/ public void setHp(int hp) { this.hp = hp; } public void setMp(int mp) { this.mp = mp; } public void setHero_type(Type hero_type) { this.hero_type = hero_type; } public void setArticle(String[] article) { this.article = article; } public void setSkill(List<String> skill) { this.skill = skill; } public void setBuff(Map<String, String> buff) { this.buff = buff; } public void setGroup(Set<String> group) { this.group = group; } public void setGold(String gold) { this.gold = gold; } public void setCool_down(Properties cool_down) { this.cool_down = cool_down; } /**set方法結束**/ public void show(){ System.out.println("英雄名:"+name); System.out.println("生命值:"+hp+" 魔法值:"+mp); System.out.println("英雄型別:"+ hero_type.getType()); System.out.println("英雄技能:"+skill); System.out.println("技能狀態:"+cool_down); System.out.print("物品欄裝備:"); for (int i=0;i<article.length;i++){ System.out.print(article[i]+" "); } System.out.println(); System.out.println("buff欄:"+buff); System.out.println("隊友:"+group); System.out.println("當前金錢:"+gold); System.out.println("當前經驗值:"+exp+" 當前等級:"+lv); } }
Type程式碼
package cn.dota2.tpye;
public class Type {
private String type;//英雄型別
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
Test程式碼
package cn.dota2.test; import cn.dota2.hero.Hero; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml"); Hero doom=(Hero) ac.getBean("doom"); doom.show(); } }
beans程式碼
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!--通過p空間注入等級,經驗值-->
<bean id="doom" class="cn.dota2.hero.Hero" p:lv="18" p:exp="12354">
<!--通過構造器注入傳入英雄名字-->
<constructor-arg index="0" value="末日使者"/>
<!--通過常量注入傳入英雄生命值,魔法值-->
<property name="hp" value="1000"/>
<property name="mp" value="500"/>
<property name="hero_type" ref="type"/>
<!--通過陣列注入英雄裝備-->
<property name="article">
<array>
<value>點金</value>
<value>飛鞋</value>
<value>輝耀</value>
</array>
</property>
<!--通過list注入英雄技能-->
<property name="skill" >
<list>
<value>吞噬</value>
<value>焦土</value>
<value>閻刃</value>
<value>末日</value>
</list>
</property>
<!--通過map注入英雄技能-->
<property name="buff">
<map>
<entry key="加速" value="10s"></entry>
<entry key="眩暈" value="5s"></entry>
</map>
</property>
<!--通過set注入英雄技能-->
<property name="group">
<set>
<value>藍胖</value>
<value>剛背</value>
<value>猛獁</value>
<value>人馬</value>
</set>
</property>
<!--null注入-->
<property name="gold"><null></null></property>
<!--通過properties注入技能狀態-->
<property name="cool_down">
<props>
<prop key="末日">未學習</prop>
<prop key="吞噬">5s</prop>
<prop key="焦土">就緒</prop>
<prop key="閻刃">就緒</prop>
</props>
</property>
</bean>
<!--通過bean注入傳入英雄型別-->
<bean id="type" class="cn.dota2.tpye.Type">
<property name="type" value="力量型英雄"/>
</bean>
</beans>
結果
這個例子也說明了spring的重要,如果不用依賴注入,那麼遊戲設計師每次設計技能,更新遊戲資料,都需要更改原始碼,這是非常危險的,而且遊戲設計師不一定會,但是現在,我們只需要暴露出一個beans檔案就可以了。