java 注入日志_java框架学习日志-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,点加号,添加进去)

28657e320501b00300c55f9b67a01401.png

c空间注入(也是构造函数注入,和p空间注入用法一样,就没有写例子了),构造器注入,常量注入,数组注入,list注入,map注入,set注入,null注入,properties注入,bean注入。为了理解,以游戏为例,我们创建一个英雄。然后每种注入都用一次来配置。代码如下

目录

fa219cb194a259a395acd016c2015e2c.png

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 skill;//技能,通过list注入

private Map buff;//英雄状态,String为名字,int为持续时间,通过map注入

private Set 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 skill) {

this.skill = skill;

}

public void setBuff(Map buff) {

this.buff = buff;

}

public void setGroup(Set 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

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代码

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">

点金

飞鞋

辉耀

吞噬

焦土

阎刃

末日

蓝胖

刚背

猛犸

人马

未学习

5s

就绪

就绪

结果

f0cbca311b4d437b67de06110c8855bf.png

这个例子也说明了spring的重要,如果不用依赖注入,那么游戏设计师每次设计技能,更新游戏数据,都需要更改源代码,这是非常危险的,而且游戏设计师不一定会,但是现在,我们只需要暴露出一个beans文件就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
anylog 是一个可以在代码的任意区域无入侵地加入日志的工具,适用于线上问题排查。 anylog 为开发人员提供一个易于使用的平台,帮助开发人员在正在运行的系统中随时加入自己想要的日志,而免于修改代码和重启。 使用场景举例     1、一些同学在写代码时,把异常吃掉了,使得问题难以查找,可以使用这个工具,动态打印出被吃掉         的异常,而不用停机。     2、一些项目依赖第三方jar包,如果发生问题,但第三方包中无日志打印,以往可能需要重新编译第         三方包,加上日志,重启服务,然后排查问题。但使用这个工具,就可以直接动态加入日志,而不用         修改第三方jar包,也不用重启。 已有功能     1、让系统打印某个exception的堆栈,无论此exception是否已经被吃掉都可打印     2、在某个指定的某个方法的某一行,输出日志。     3、在某个指定的某个方法的开始,输出日志。     4、在某个指定的某个方法的结束,输出日志。       5、打印方法耗时,支持方法嵌套。     如果需要扩展新的功能(例如输出jvm的cpu占用,内存大小等),只需要实现spi中的     com.github.jobop.anylog.spi.TransformDescriptor      和com.github.jobop.anylog.spi.TransformHandler接口,     然后把实现的jar包放到providers目录中即可识别。 使用方法     1、获取运行程序:         1)可以到以下地址获取正式发行版:https://github.com/jobop/release/tree/master/anylog         2)你也可以clone下源码后,执行如下命令,生成运行程序,生成的运行程序将在dist目录下             生成windows版本:  mvn install             生成linux版本:  mvn install -Plinux     2、直接执行startup.bat或者startup.sh即可运行起来     3、访问 http://127.0.0.1:52808 即可使用 功能扩展     anylog利用spi机制实现其扩展,如果你想要对anylog增加新的功能(例如添加返回值打印的功能)可以按照如下步骤操作:     1、使用如下命令,生成一个spi实现工程,并导入eclipse     mvn archetype:generate -DarchetypeGroupId=com.github.jobop -DarchetypeArtifactId=anylogspi-archetype -DarchetypeVersion=1.0.4     2、参照该工程中已有的两个例子(一个是在方法开始插入日志,一个是在方法结束插入日志),实现TransformDescriptor和TransformHandler接口     3、把两个接口实现的全路径,分别加到以下两个文件中         src/main/resources/META-INF/services/com.github.jobop.anylog.spi.TransformDescriptor         src/main/resources/META-INF/services/com.github.jobop.anylog.spi.TransformHandler     4、执行mvn install打包,在dist下会生成你的扩展实现jar。     5、把扩展实现jar拷贝到anylog的providers目录下,重启即可生效。     tips:在实现spi时,我们提供了SpiDesc注解,该注解作用在你实现的TransformDescriptor上,可以用来生成功能描述文字。          如果要深入了解spi机制,请自行google:java spi 标签:anylog
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值