Spring DI(依赖注入)详解
参考文章:DI以及依赖注入详解
【SSH系列】深入浅出spring IOC中三种依赖注入方式
1 DI是什么?
在应用间通常会有两个或者多个类组成,然后他们互相协作共同完成一个特定的业务逻辑,每个对象负责管理与自己相互协作的对象的引用。这将会导致高耦合难以测试的代码。
简单的说DI是能够将组件的依赖关系进行松耦合一种编程方式,让组件之间复杂的依赖关系简单化,下面演示DI的好处:
package com.example.spring.DI;
import lombok.extern.slf4j.Slf4j;
/**
* 演示在demo01里初始化demo02的类的行为
*/
@Slf4j
public class Demo01 {
private Demo02 demo02;
private Quest quest;
/**
* 可以发现Demo02类与Demo01类紧紧耦合在一起,紧密耦合的代码难以测试,难以复用。紧耦合
* demo01只能够做demo02的类的行为
*/
public Demo01(){
demo02=new Demo02();
}
/**
* 将quest类注入到Demo01类里,可以把很多行为写在quest里,这种方式为构造器注入,
* 可以定义一个quest接口或者抽象类,然后将所有的共同行为实现quest类,实现了松耦合
* @param quest
*/
public Demo01(Quest quest){
this.quest=quest;
}
public void B(){
log.debug(""+demo02.A());
}
}
最重要的是quest为定义的所有请求,可以是一个接口,然后将它以构造器的形式注入到类中,可以使用不同的具体实现类 执行不同的行为。
2 依赖注入
依赖注入的3种方式:
2.1 构造器注入
在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
2.2 接口注入
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
2.3 Setter 注入
对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
3 代码示例
3.1 构造器注入
import com.tgb.spring.dao.UserDao;
public class UserManagerImpl implements UserManager{
private UserDao userDao;
//使用构造方式赋值
public UserManagerImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser(String userName, String password) {
userDao.addUser(userName, password);
}
}
3.2 接口注入
public class ClassA {
private InterfaceB clzB;
public void doSomething() {
Ojbect obj = Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
clzB.doIt();
}
……
}
3.3 Setter 注入
import com.tgb.spring.dao.UserDao;
public class UserManagerImpl implements UserManager{
private UserDao userDao;
//使用设值方式赋值
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser(String userName, String password) {
userDao.addUser(userName, password);
}
}
还没有评论,来说两句吧...