依赖注入:Dependency Injection,简称”DI”
1. Java中的依赖注入
1.1. 什么是依赖注入
依赖注入是一个概念,对象从外部得到它所需要的其他对象。DI可以用很多语言来实现,依赖注入背后的一般概念称为控制反转。
如果一个java类使用了另外类的一个实例,我们就可以说一个Java类依赖其他类。例如,一个访问日志服务的类依赖于这个日志类。
理想的情况下,Java类应该尽可能的独立于其他的类。这增加了重复使用这些类的可能性,以及能够独立于其他的类对它们进行测试。
如果一个java类使用“new”的操作符创建了另外一个类的实例,它就不能独立于这个类使用或测试,这种情况称为“硬依赖”。
public class C {
public void sayHello(){
A a = new A();
a.name = "wofwj";
}
}
上面代码中,我们可以看到在名为C这个类的sayHello方法里面使用new操作符创建了一个A对象的实例a,那么就说明A是C的硬依赖。
一个框架类,通常被称为依赖容器,能够分析这个类的依赖。通过分析它能够创建类的实例,并通过java的反射注入这个对象到它定义的依赖中。
通过这种方式,Java类没有硬依赖。意味着它不依赖于具体某个类的实现,它允许你在隔离的情况下测试自己的类,例如通过使用模拟对象。
模拟对象(mocks)和真实的对象表现很相似。但是这些模拟对象不是编程所得,它们被配置为以某种预先特定的方式运行的。
1.2. 使用Java注解描述类的依赖
描述一个类的依赖有很多不同的方法。更通用的办法是使用java注解在类中直接描述这些依赖。
描述类依赖的java注解的标准是在Java的规范要求330(JSR——Java Specification Request),即JSR330中定义的。这个标准描述了@Inject、@Name注解。
public class MyInjectionTest{
@Inject
private Logger log;
public void saveLogger(String errorInfo){
log.error(errorInfo);
}
}