IoC(控制反转)和 AOP(面向切面编程)是 Spring 框架的核心思想,用于解决对象管理和代码复用问题。
什么是 IoCIoC(Inversion of Control,控制反转)是一种设计思想,用于解决 Java 开发中对象的创建和管理问题。
- 传统开发方式:类 A 依赖类 B 时,通常在类 A 中通过 new 关键字手动创建类 B 的对象。
- 使用 IoC 的开发方式:对象的创建和管理权交给 IoC 容器(如 Spring 框架),需要对象时直接从容器中获取。
控制反转的含义:
- 控制:指对象创建、实例化和管理的权力。
- 反转:将控制权交给外部环境(如 Spring 框架或 IoC 容器)。
IoC 解决了什么问题IoC 思想通过第三方容器管理资源,降低对象之间的耦合度,使资源更易于管理。例如:
- 降低耦合度:对象之间不直接依赖,而是通过 IoC 容器间接关联。
- 资源管理方便:例如,使用 Spring 容器可以轻松实现单例模式。
示例场景:
- 未使用 IoC:Service 层直接通过 new 关键字创建 Dao 层的实现类对象。当需要更换 Dao 实现时,需修改所有引用该实现的地方,维护成本高。
- 使用 IoC:对象的创建和管理权交给 IoC 容器,使用时直接从容器中获取,无需关心具体实现。更换实现时,只需修改容器配置,无需改动业务代码。
IoC 和 DI 的区别- IoC(控制反转):是一种设计思想,指将对象创建和管理的控制权交给外部容器。
- DI(依赖注入):是 IoC 最常见和合理的实现方式,通过容器动态注入依赖对象。
关键点:
- IoC 是一种设计原则,DI 是其具体实现。
- IoC 容器是一个 Map 结构,用于存储和管理对象。
- Martin Fowler 建议将 IoC 改名为 DI,以更准确地描述这一模式。
什么是 AOPAOP(Aspect Oriented Programming,面向切面编程)是 OOP(面向对象编程)的补充,用于解决横切逻辑代码的问题。
- OOP 的局限性:OOP 通过继承和多态解决了大部分代码复用问题,但对于多个方法中重复出现的横切逻辑代码(如日志、性能监控)无能为力。
- AOP 的解决方案:通过横向抽取机制,将横切逻辑代码与业务逻辑代码分离。
示例场景:
- OOP 方式:在每个方法的相同位置插入重复代码(如性能监控代码),导致代码臃肿且难以维护。
public class Animal { public void eat() { // 性能监控代码 long start = System.currentTimeMillis(); // 业务逻辑代码 System.out.println("I can eat..."); // 性能监控代码 System.out.println("执行时长:" + (System.currentTimeMillis() - start)/1000f + "s"); } public void run() { // 性能监控代码 long start = System.currentTimeMillis(); // 业务逻辑代码 System.out.println("I can run..."); // 性能监控代码 System.out.println("执行时长:" + (System.currentTimeMillis() - start)/1000f + "s"); }}- AOP 方式:将横切逻辑代码(如性能监控)抽取到切面中,通过动态织入的方式应用到业务逻辑中,无需修改原有代码。
AOP 解决了什么问题AOP 主要解决以下问题:
- 代码复用:避免横切逻辑代码在多个地方重复出现。
- 解耦合:将横切逻辑代码与业务逻辑代码分离,降低耦合度。
- 易于维护:修改横切逻辑时,无需改动业务逻辑代码。
AOP 为什么叫面向切面编程- 切:指横切逻辑,即与业务逻辑无关的代码(如日志、事务、安全等)。
- 面:横切逻辑通常会影响多个方法,每个方法是一个点,多个点构成一个面。
总结:AOP 通过面向横切逻辑的方式,将分散的重复代码集中管理,实现代码复用和解耦合。