跳至主要內容

IoC容器概述

向往大约 2 分钟SpringIoc

什么是IoC

说起IoC习惯想起来的就是控制反转,依赖注入。根据维基百科的描述如下:

控制反转(英语:Inversion of Control,缩写为IoC),是面向对象编程open in new window中的一种设计原则,可以用来减低计算机代码之间的耦合度open in new window。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。

简单来说,IoC是一种设计思想,Spring IoC是其对应的产品实现,在没有使用IoC之前对象的引用或依赖关系的管理由具体对象完成,使用IoC之后由IoC容器进行管理。以一段订单处理系统的代码为例:

使用IoC示例

// OrderService.java
public class OrderService {
    private PaymentService paymentService;

    // 构造函数注入
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    public void processOrder() {
        // 处理订单逻辑
        paymentService.pay();
    }
}

// PaymentService.java
public interface PaymentService {
    void pay();
}

// CreditCardPaymentService.java
public class CreditCardPaymentService implements PaymentService {
    public void pay() {
        // Credit Card 支付逻辑
    }
}

// Main.java
public class Main {
    public static void main(String[] args) {
        // 创建 Spring 容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 从容器中获取 OrderService
        OrderService orderService = context.getBean(OrderService.class);

        // 处理订单
        orderService.processOrder();
    }
}

可知,**OrderService **和 PaymentService 实例对象的依赖关系由Spring容器进行管理,减少了耦合。

不使用Ioc示例

public class OrderService {
    private PaymentService paymentService;

    // 构造函数中直接实例化 PaymentService
    public OrderService() {
        this.paymentService = new CreditCardPaymentService(); // 这里直接依赖于具体实现类
    }

    public void processOrder() {
        // 处理订单逻辑
        paymentService.pay();
    }
}

public class CreditCardPaymentService implements PaymentService {
    public void pay() {
        // Credit Card 支付逻辑
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建 OrderService 实例
        OrderService orderService = new OrderService();

        // 处理订单
        orderService.processOrder();
    }
}

在这个不使用 IoC 的例子中,OrderService 直接实例化了 CreditCardPaymentService,这会导致高耦合度,并且很难进行单元测试。而在使用 IoC 的例子中,依赖关系由 Spring 容器管理,使得代码更加松散耦合,易于维护和测试。

接下来一起去探索Spring IoC的内部实现~ :😄