以下是对Spring核心概念IoC(控制反转)、DI(依赖注入)和AOP(面向切面编程)的详细解释:
目录
一、IoC(控制反转)
-
基本概念:控制反转(Inversion of Control,IoC)是一种设计思想,用于降低代码之间的耦合度。在传统的程序中,对象内部主动创建依赖对象,控制权在对象本身;而在IoC方式中,对象的创建和依赖关系管理由外部容器负责,控制权转移到容器456。
-
原理:IoC的实现主要依赖于依赖注入(Dependency Injection,DI)、容器(Container)和配置文件(或注解)。容器是IoC的核心,它负责创建和管理对象,通过读取配置文件或注解来创建对象,并将其存储在内部的一个Map结构中,以供程序在需要时获取。
-
好处
- 降低代码耦合度:将对象的创建权交给外部容器来管理,实现对象之间的解耦,当某个对象需要修改或替换时,只需修改配置文件或注解即可,无需修改其他代码5。
- 提高代码的可维护性和可扩展性:添加新功能或修改现有功能时,只需在配置文件或注解中定义新的对象或修改现有对象的定义5。
- 支持AOP编程:可以将切面(如日志、事务管理等)与业务逻辑代码分离,实现横向关注点的模块化,让开发者更专注于业务逻辑的实现5。
- 简化测试工作:在测试过程中,可以轻松地替换外部资源的实现方式,从而简化测试工作5。
-
实现方式
- 基于XML的配置:需要在XML配置文件中定义对象的创建方式、依赖关系等,Spring容器会读取该配置文件并根据其中的定义来创建和管理对象5。
- 基于注解的配置:使用注解来定义对象的创建和依赖关系,Spring会根据注解自动扫描和装配Bean5。
- 代码demo ICO代码demo
二、DI(依赖注入)
-
基本概念:依赖注入(Dependency Injection,DI)是IoC的具体实现方式,指将对象所依赖的外部资源(如其他对象、配置信息等)通过某种方式(如构造函数、setter方法等)注入到对象内部,从而实现对象之间的解耦578。
-
注入方式
- 构造器注入:通过构造函数注入依赖对象,适用于必填依赖,有利于测试和单元测试,推荐使用。例如,在构造器上使用@Autowired注解,或者当类只有一个构造器时,Spring会自动生效78。
- Setter方法注入:通过Setter方法注入依赖对象,适合可选依赖或存在循环依赖的情况。使用@Autowired标注在set方法上78。
- 字段注入:直接通过反射将依赖对象注入到类的字段中,虽然常见但一般不推荐在生产环境中大量使用,因为它隐藏了依赖关系,不利于mock和测试78。
-
注入流程:Spring启动时加载配置或扫描@Component类,然后创建Bean(通过反射),接着遍历Bean中的字段、方法或构造器查找@Autowired、@Resource等注解,再根据规则(类型、名字)查找容器中匹配的Bean,最后完成注入并将对象放入IoC容器7。
-
代码demo DI代码demo
三、AOP(面向切面编程)
-
基本概念:AOP是一种编程范式,旨在将横切关注点(如日志记录、事务管理、安全控制等)与业务逻辑分离。这些横切关注点通常散布在多个业务模块中,AOP允许开发者将这些关注点模块化,从而提高代码的可维护性和复用性2。
-
核心概念
- 切面(Aspect):横切关注点的模块化,包含一组通知和切点。它是一个普通的Java类,使用@Aspect注解标注123。
- 通知(Advice):切面的行为,定义了在何时何地应用切面的逻辑。Spring AOP包括前置通知(@Before)、后置通知(@AfterReturning)、异常通知(@AfterThrowing)、最终通知(@After)和环绕通知(@Around)等常见类型123。
- 切点(Pointcut):匹配连接点的谓词,决定通知应该应用到哪些连接点。它通过表达式来定义,如execution(* com.example.service..(..))表示匹配com.example.service包下所有类的任意方法123。
- 连接点(Join Point):程序执行过程中的特定点,如方法调用、方法执行、异常处理等。在Spring中,仅支持方法级连接点123。
-
实现机制:Spring AOP默认使用动态代理实现AOP功能,有两种方式。一是JDK动态代理,当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建代理;二是CGLIB代理,当目标对象没有实现任何接口时,Spring会使用CGLIB库生成目标类的子类作为代理2。
-
应用场景
- 日志管理:记录方法出入参、执行时间、异常信息等。通过环绕通知捕获ProceedingJoinPoint,获取方法名、参数列表及执行耗时3。
- 事务管理:Spring的@Transactional注解通过AOP实现,在环绕通知中开启、提交或回滚数据库事务3。
- 权限控制:前置通知中调用权限校验服务,校验不通过时抛出异常3。
- 性能监控:环绕通知记录方法执行时间,超过阈值时输出警告日志3。
- 代码demo Springboot之AOP面向切片编程代码demo-CSDN博客