spring中IoC和DI浅析

IoC和DI都是spring框架中的重要概念,通常也是成对出现的,下面对IoC和DI及其关系进行简单分析。
1、IoC
IoC(Inversion of Control),控制反转,它不是一个具体的技术,而是一个实现对象解耦的思想。
其中,耦合是指两个或两个以上对象存在依赖关系,当一方修改之后会影响另一方,那么就说这些对象存在耦合。而解耦就是解除两个或两个以上对象,修改其中一方之后影响另一方的问题。
那么IoC如何实现解耦?
如,A对象中需要使用B对象的某个方法,那么通常的实现方法是这样的:

class A {
    public void init() {
        // 调用 B 类中的 init 方法
        B b = new B();
        b.init();
    }
}
class B {
    public B() {
    }

    public void init() {
        System.out.println("你好,世界。");
    }
}

此时对象A和对象B是存在耦合的,因为一旦修改了B对象构造方法的参数之后,那么A对象里的写法也要跟着改变,如将构造方法改为如下:

class B {
    public B(String name) {
        System.out.println("姓名:" + name);
    }
    
    public void init() {
        System.out.println("你好,世界。");
    }
}

此时B对象的构造方法已经从原来的无参变为了有参,那么之前A对象里的调用就会报错,这里不考虑构造方法重载的情况。
这时可以通过将对象传递而并非new对象的方式来解决,如下所示:

class A {
    // 先定义一个需要依赖的 B 对象
    private B b;
    // 通过构造方法实现赋值(初始化)
    public A(B b) {
        this.b = b;
    }
    public void init() {
        // 调用 B 类中的 init 方法
        b.init();
    }
}
class B {
    public B(String name) {
        System.out.println("姓名:" + name);
    }
    public void init() {
        System.out.println("你好,世界。");
    }
}

这样改造之后,无论构造方法怎么修改,即使加了很多的参数,而调用它的A类都无需做任何修改,这样就实现了对象的解耦。
上面的示例和IoC实现解耦的思路是一样的,就是通过将对象交给spring中IoC容器管理,在其他类中不直接new对象,而是通过将对象传递到当前类的方式来实现解耦。
在new对象的时代,对象的管理权是由当前类控制的,而有了IoC之后,对象的管理权就交给非当前类的IoC容器管理了,此时对象的管理权就发生了反转和改变,这就是IoC,控制(权)反转。

2、DI
DI(Dependency Injection),依赖注入,它不是一种设计实现,而是一种具体的技术。依赖注入是在IoC容器运行期间,动态的将某个依赖对象注入到当前对象的技术就叫做DI依赖注入。
在上面示例中,A类在使用B类时,就是通过构造方法将依赖对象B引入的,这种实现方法就可以看作是通过构造方法实现依赖注入的手段,如下:

class A {
    // 先定义一个需要依赖的 B 对象
    private B b;
    // 通过构造方法实现赋值
    public A(B b) {
        this.b = b;
    }
    public void init() {
        // 调用 B 类中的 init 方法
        b.init();
    }
}

在spring中,通常是采用注解@Autowired或@Resource进行依赖注入。

3、关系
IoC和DI虽然定义不同,但他们所做的事情都是一样的,就是都是用来实现对象解耦的;不同之处是IoC是一种设计思想,而DI是一种具体的实现技术。
IoC就是容器,DI就是注入这一行为,那么DI就是IoC具体功能的实现,所以IoC和DI是相辅相成的拍档,都是为了实现对象解耦。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值