文档章节

java框架学习日志-5(常见的依赖注入)

 白话
发布于 2018/12/14 01:43
字数 1267
阅读 17
收藏 5

依赖注入(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文件就可以了。

© 著作权归作者所有

共有 人打赏支持
粉丝 7
博文 19
码字总数 21678
作品 0
梁平
私信 提问
SpringBoot整合Mybatis+Druid

1.SpringBoot 作为一款约定大于配置的微服务框架,得到了业界的大量推广和应用。对SpringBoot的学习使用可以有效的帮助开发简化开发流程,配置过程,部署过程。 2.数据库的交互是开发过程中很...

扁桃体准备发言了
2018/08/16
0
0
mybatis 学习笔记(一):mybatis 初认识

mybatis 学习笔记(一):mybatis 初认识 简介 MyBatis是一个Java持久层框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。mybatis 可以将 preparedStatement 中的输入参数自动...

希希里之海
2018/08/22
0
0
Java Web 框架 Latke v2.4.39,重写控制器层

简介 Latke('lɑ:tkə,土豆饼)是一个简单易用的 Java Web 应用开发框架,包含 MVC、IoC、事件通知、ORM、插件等组件。 在实体模型上使用 JSON 贯穿前后端,使应用开发更加快捷。这是 Latk...

88250
2018/12/21
0
0
2017 年不容错过的 10+ 个开源 Java 库

向阅读此文的读者问好, 此文的灵感来自于 Andres Almiray 的工作。 这些开源库非常棒,我已经将它们整理成参考清单,附上简短的功能清单连同案例一同分享。 请欣赏! Guice Guice(音同“j...

oschina
2017/02/21
7.1K
12
聊聊Dubbo - Dubbo可扩展机制源码解析

摘要: 在Dubbo可扩展机制实战中,我们了解了Dubbo扩展机制的一些概念,初探了Dubbo中LoadBalance的实现,并自己实现了一个LoadBalance。是不是觉得Dubbo的扩展机制很不错呀,接下来,我们就...

阿里云云栖社区
2018/06/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【转】初次提交项目到github

第一步:安装Git 第二步:在自己的工程目录下右键鼠标 选择 Git Bash Here 执行命令 git init 来创建一个本地代码仓库 执行命令 git add . 来把所有文件添加到仓库 执行命令 git commit -m ...

覃光林
18分钟前
3
0
Zend Studio使用教程:使用PHPUnit检测代码(五)

本教程演示如何在代码上创建和运行PHPUnit Test。您将学习如何创建和运行包含许多测试用例的单个单元测试用例和测试套件。 单元测试是一个测试代码的过程,以确保源代码的各个单元正常工作,...

电池盒
18分钟前
2
0
前端 联想搜索下拉框

data.result 为联想搜索出来的数组 innerhtml += "<ul style='list-style:none;font-size:13px;margin: 0px;padding: 5px;'>";for (var j = 0; j < data.result.length; j++) { var r......

yan_liu
18分钟前
2
0
预计2019年发布的Vue3.0到底有什么不一样的地方?

摘要: Vue 3.0预览。 原文:预计今年发布的Vue3.0到底有什么不一样的地方? 作者:小肆 Fundebug经授权转载,版权归原作者所有。 还有几个月距离 vue2 的首次发布就满 3 年了,而 vue 的作者...

Fundebug
18分钟前
2
0
跟我学Spring Cloud(Finchley版)-11-Feign常见问题总结

本文总结Feign常见问题及解决方案。 一、FeignClient接口如使用@PathVariable ,必须指定value属性 代码示例: @FeignClient("microservice-provider-user")public interface UserFeignCli......

周立_ITMuch
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部