IoC容器概述
大约 2 分钟SpringIoc
什么是IoC
说起IoC习惯想起来的就是控制反转,依赖注入。根据维基百科的描述如下:
控制反转(英语:Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(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的内部实现~ :😄