📜  IoC、DI (1)

📅  最后修改于: 2023-12-03 14:42:08.786000             🧑  作者: Mango

IoC与DI

什么是IoC?

IoC(Inversion of Control)即“控制反转”,是一种架构设计方式,它将传统开发中对象之间的调用关系反转,把对对象的控制权交给容器,由容器负责将需要的对象注入到其他对象中。这种方式消除了对象之间的耦合,提高了代码的灵活性和可复用性。

使用IoC模式可以将程序划分成多个独立的组件,每个组件都有自己的职责和依赖关系。各组件之间的依赖关系由IoC容器负责管理,这些组件通过IoC容器构成了一个松耦合的系统。

什么是DI?

DI(Dependency Injection)即“依赖注入”,是IoC容器的实现方式之一,它通过将对象的依赖关系注入到对象中,实现了对对象之间的控制反转。

在DI模式中,IoC容器通过注入对象的构造函数、属性或者方法来自动地创建对象及其依赖关系。这样就使得对象之间的构造逻辑和依赖关系不再由程序员手动实现,而是由IoC容器自动处理,提高了代码的可读性和可维护性。

IoC与DI的关系

IoC是一种设计原则,而DI是实现IoC的具体方式之一。通常情况下,使用DI实现IoC的过程中,程序员需要借助IoC容器完成依赖关系的自动注入。

IoC容器的分类

IoC容器是实现IoC模式的关键,在Java中常见的IoC容器有三种:

  1. Spring IoC容器:Spring是一个基于Java EE平台的开源框架,提供了一个容器来管理对象和之间的依赖关系。

  2. Google Guice:Guice是一个轻量级的依赖注入框架,使用Java语言编写,具有很好的扩展性和灵活性。

  3. Java EE 6 CDI容器:CDI是Java EE 6提供的一个依赖注入框架,它提供了一个高度可扩展的容器,用于管理组件之间的依赖关系。

IoC容器的基本使用

以Spring IoC容器为例,下面介绍IoC容器的基本使用方法:

  1. 定义对象
public class Person {
    
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
}
  1. 配置容器
<beans>
    <bean id="person" class="com.example.Person">
        <constructor-arg value="张三"/>
        <constructor-arg value="25"/>
    </bean>
</beans>
  1. 使用容器
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
        Person person = (Person) context.getBean("person");
        System.out.println(person.getName());
    }
}

注:上述示例代码在Spring 5.x中已经过时,详见Spring IoC容器的配置与使用

总结

IoC和DI是一种常见的设计模式和编程范式,它们的主要目的是降低对象之间的耦合度,提高程序的扩展性和可维护性。IoC容器是实现IoC和DI的关键,它通过完成对象的自动管理和依赖注入,使得程序员可以更加关注业务逻辑的实现,提高了开发效率。