java框架學習日誌-5(常見的依賴注入)

依賴注入(dependency injection)

以前提到控制反轉(Inversion of Control)也叫依賴注入,它們實際上是一個東西,只是看的角度不一樣,這章詳細說一下依賴注入。
依賴——指bean對象建立依賴於容器,bean對象依賴於資源(對象,常量,變量等)。
注入——bean對象依賴的資源經過容器來設置和裝配(裝配是指,好比一個對象A,須要一個對象B的實例,spring在配置對象A的時候,須要傳入對象B的一個實例。會檢查有沒有有B,有的話,就拿來用,或者在配置對象其餘屬性時,傳值的一個過程,叫裝配)。
本章主要補充以前沒有用到的注入方式,和總結學過的注入。java

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代碼spring

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>

結果
this

這個例子也說明了spring的重要,若是不用依賴注入,那麼遊戲設計師每次設計技能,更新遊戲數據,都須要更改源代碼,這是很是危險的,並且遊戲設計師不必定會,可是如今,咱們只須要暴露出一個beans文件就能夠了。設計

相關文章
相關標籤/搜索