详解 Spring 的核心概念:IoC(控制反转)、DI(依赖注入)、AOP(面向切面编程)

以下是对Spring核心概念IoC(控制反转)、DI(依赖注入)和AOP(面向切面编程)的详细解释:

目录

一、IoC(控制反转)

二、DI(依赖注入)

三、AOP(面向切面编程)


一、IoC(控制反转)

  1. 基本概念:控制反转(Inversion of Control,IoC)是一种设计思想,用于降低代码之间的耦合度。在传统的程序中,对象内部主动创建依赖对象,控制权在对象本身;而在IoC方式中,对象的创建和依赖关系管理由外部容器负责,控制权转移到容器456。

  2. 原理:IoC的实现主要依赖于依赖注入(Dependency Injection,DI)、容器(Container)和配置文件(或注解)。容器是IoC的核心,它负责创建和管理对象,通过读取配置文件或注解来创建对象,并将其存储在内部的一个Map结构中,以供程序在需要时获取。

  3. 好处

    • 降低代码耦合度:将对象的创建权交给外部容器来管理,实现对象之间的解耦,当某个对象需要修改或替换时,只需修改配置文件或注解即可,无需修改其他代码5。
    • 提高代码的可维护性和可扩展性:添加新功能或修改现有功能时,只需在配置文件或注解中定义新的对象或修改现有对象的定义5。
    • 支持AOP编程:可以将切面(如日志、事务管理等)与业务逻辑代码分离,实现横向关注点的模块化,让开发者更专注于业务逻辑的实现5。
    • 简化测试工作:在测试过程中,可以轻松地替换外部资源的实现方式,从而简化测试工作5。
  4. 实现方式

    • 基于XML的配置:需要在XML配置文件中定义对象的创建方式、依赖关系等,Spring容器会读取该配置文件并根据其中的定义来创建和管理对象5。
    • 基于注解的配置:使用注解来定义对象的创建和依赖关系,Spring会根据注解自动扫描和装配Bean5。
  5. 代码demo ICO代码demo

二、DI(依赖注入)

  1. 基本概念:依赖注入(Dependency Injection,DI)是IoC的具体实现方式,指将对象所依赖的外部资源(如其他对象、配置信息等)通过某种方式(如构造函数、setter方法等)注入到对象内部,从而实现对象之间的解耦578。

  2. 注入方式

    • 构造器注入:通过构造函数注入依赖对象,适用于必填依赖,有利于测试和单元测试,推荐使用。例如,在构造器上使用@Autowired注解,或者当类只有一个构造器时,Spring会自动生效78。
    • Setter方法注入:通过Setter方法注入依赖对象,适合可选依赖或存在循环依赖的情况。使用@Autowired标注在set方法上78。
    • 字段注入:直接通过反射将依赖对象注入到类的字段中,虽然常见但一般不推荐在生产环境中大量使用,因为它隐藏了依赖关系,不利于mock和测试78。
  3. 注入流程:Spring启动时加载配置或扫描@Component类,然后创建Bean(通过反射),接着遍历Bean中的字段、方法或构造器查找@Autowired、@Resource等注解,再根据规则(类型、名字)查找容器中匹配的Bean,最后完成注入并将对象放入IoC容器7。

  4. 代码demo DI代码demo

三、AOP(面向切面编程)

  1. 基本概念:AOP是一种编程范式,旨在将横切关注点(如日志记录、事务管理、安全控制等)与业务逻辑分离。这些横切关注点通常散布在多个业务模块中,AOP允许开发者将这些关注点模块化,从而提高代码的可维护性和复用性2。

  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。
  3. 实现机制:Spring AOP默认使用动态代理实现AOP功能,有两种方式。一是JDK动态代理,当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建代理;二是CGLIB代理,当目标对象没有实现任何接口时,Spring会使用CGLIB库生成目标类的子类作为代理2。

  4. 应用场景

    • 日志管理:记录方法出入参、执行时间、异常信息等。通过环绕通知捕获ProceedingJoinPoint,获取方法名、参数列表及执行耗时3。
    • 事务管理:Spring的@Transactional注解通过AOP实现,在环绕通知中开启、提交或回滚数据库事务3。
    • 权限控制:前置通知中调用权限校验服务,校验不通过时抛出异常3。
    • 性能监控:环绕通知记录方法执行时间,超过阈值时输出警告日志3。
  5. 代码demo Springboot之AOP面向切片编程代码demo-CSDN博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值