一.什么是IOC
-
IOC(Inversion of Control,控制反转):
- IOC指的是将控制权从应用程序代码中转移到框架或容器中(在这里我通常指Spring)。传统的程序设计中,应用程序代码通常直接控制其依赖对象的创建与生命周期,而在IOC中,控制权被反转了,由框架或容器来负责管理和注入依赖对象,从而实现了松耦合的设计。
- 例如,在典型的依赖注入中,对象不再负责创建它所依赖的对象,而是由外部容器(如Spring框架)来创建并注入这些依赖对象,这样做可以提高代码的灵活性和可测试性。
-
依赖注入(DI):
- 依赖注入是IOC的一种实现方式,它指的是将一个对象的依赖关系(如构造函数、方法参数等)从对象本身分离出来,由外部容器动态地注入这些依赖关系。
- DI通过接口或配置来实现,使得不同模块之间的依赖关系更清晰,并且能够方便地进行替换和扩展。
二.IOC的优点
-
优势与应用场景:
- 松耦合:通过IOC/DI,不同组件之间的耦合度降低,提高了代码的灵活性和可维护性。
- 可测试性:依赖关系外置后,可以更容易地进行单元测试和集成测试。
- 模块化:更容易实现模块化开发,各模块之间的职责更加清晰。
三.IOC/DI的实现方式
1.Maven导入相关坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Context:Spring 上下文 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
2.创建配置文件
3.基本使用(这里使用注解注入)
创建Dao层:
创建Service层:
在Web层进行测试:
输出结果为:
可以看到程序能正常运行
四.补充说明
一.依赖注入的几种方式
1.set注入:
2.构造器注入:
注意要在UserService类中给出构造方法
3.注解注入
就是我们上面演示的例子,常见的注解有以下几种:
在实际开发中,注解注入更常见也更方便,相比于书写xml配置文件,注解的逻辑更清晰但一定程度上对代码可读性会造成一定影响
4.集合注入
补充一点我们可以在xml配置文件中直接通过value给指定类的指定属性赋值:
同样的,我们可以给集合赋值,包括map,list等,形如:
五.总结
概念:
-
IOC(控制反转,Inversion of Control):
- 一种设计原则,通过将控制权从应用程序代码中反转到框架或容器,达到解耦和提高代码灵活性的目的。
- 实现方式包括依赖注入(DI)和面向服务(SOA)等方法。
-
DI(依赖注入,Dependency Injection):
- IOC的一种具体实现方式,通过将对象的依赖(即其所需的其他对象)从内部创建转移到外部注入,由容器负责这部分工作,使代码更加模块化和易于测试。
- 主要有三种注入方式:构造函数注入、Setter方法注入和接口注入。
应用:
-
Spring 框架:
- 广泛应用于企业级开发,利用IOC容器和DI机制,管理对象的生命周期和依赖关系。
- 提供了多种注解(如
@Autowired
,@Component
,@Service
,@Repository
等)和 XML 配置方式。
-
Google Guice:
- 另一个流行的依赖注入框架,使用注解来描述依赖关系,简化对象创建过程。
-
其他框架和库:
- 大多数现代的企业级框架、微服务框架等都采用IOC/DI机制,比如 Java EE CDI(Contexts and Dependency Injection)、.NET Core 的依赖注入机制等。
(缺点:
- 学习曲线:
- 对初学者来说,理解和掌握IOC/DI概念以及相关工具和框架需要一定学习成本。
- 调试复杂性:
- 由于依赖关系是由容器动态管理和注入的,排查BUG可能变得复杂,需要熟悉框架内部工作机制。
- 性能开销:
- 依赖注入等操作在运行时进行,可能在一定程度上影响系统性能,尤其是在大量对象管理的场景中。不过,现代IOC容器已经在性能优化方面做了大量工作。
)