IOC和AOP

IOC

概念:

IOC(控制反转):IOC 是一种设计原则,它将控制权从程序代码中转移到外部容器或框架中。传统上,控制权由程序员在代码中硬编码,而使用 IOC,程序员通过配置文件或者其他方式描述组件之间的依赖关系,而不是在代码中直接创建这些依赖关系。这使得系统更加灵活、可扩展和易于维护。常见的 IOC 容器有 Spring Framework 中的 ApplicationContext 或者依赖注入(DI)容器。

IOC基本代码案例和一些基础知识可以看一下之前的博客

Spring IOC容器-CSDN博客

Spring框架的Bean管理_spring是如何管理bean-CSDN博客

IOC是基于反射实现的,我们将创建对象交给spring来处理。这样的话,在大型项目中,需要多个对象,我们就不需要再自己一个个创建,我们可以直接使用spring创建。

控制反转(IoC)的优势:

  1. 松耦合: IoC 将组件之间的依赖关系转移到容器中管理,使得组件之间的耦合度降低。组件不再直接依赖于具体的实现,而是依赖于抽象,从而提高了代码的灵活性和可维护性。

  2. 可测试性: IoC 使得依赖注入成为可能,可以轻松地将模拟对象注入到组件中进行单元测试。这样,你可以更容易地编写可测试的代码,并确保代码的质量。

  3. 集中管理: IoC 容器负责管理组件的生命周期和依赖关系,使得整个应用程序的配置变得更加集中和易于管理。通过配置文件或者注解,可以方便地管理组件之间的关系和行为。

  4. 扩展性: IoC 通过接口和抽象来定义组件之间的关系,使得系统更容易扩展。当需要引入新的功能或者替换现有的实现时,只需修改配置而不需要修改源代码,因此提高了系统的可扩展性和可维护性。

IOC操作Bean管理有两种形式

基于xml方式的Bean管理,Spring主要提供了<bean><property>等标签。

基于注解方式的Bean管理,Spring主要提供了@Component @Service @Controller @Repository等注解。springboot一般用这种注解的方法。

AOP

概念:

AOP 是一种编程范式,它允许开发人员将横跨应用程序的横切关注点(如日志记录、事务管理、安全性等)与核心业务逻辑分离。AOP 提供了一种方法来在程序的多个模块中声明性地应用这些关注点,而不需要在每个模块中重复编写相同的代码。在 AOP 中,这些关注点被称为"切面",它们可以横向地切入到应用程序的执行流程中。常见的 AOP 技术包括 Spring Framework 中的 AspectJ。

示意图:

AOP基础知识和示例代码也可以看下我之前的博客

AOP概念的引入,相关的概念,AOP技术_aop的引入-CSDN博客

Spring的AOP技术-注解方式_spring aop注解替换字符串-CSDN博客

AOP实现原理:

AOP底层是使用动态代理来实现的,这里有两种情况的动态代理

① 有接口的情况,使用 JDK 动态代理

即创建接口实现类代理对象,增强类的方法。

② 没有接口的情况,使用 CGLIB 动态代理

即创建子类的代理对象,增强类的方法。

面向切面编程(AOP)的优势:

  1. 模块化: AOP 将横切关注点(如日志、安全、事务管理等)与主要逻辑分离,使得代码更加模块化和清晰。通过将横切关注点抽象成切面,可以实现代码的重用和组合,避免代码重复和混乱。

  2. 可维护性: AOP 将横切关注点与主要逻辑解耦,使得修改和维护横切关注点变得更加容易。当需要修改日志记录、权限检查或者事务管理时,只需修改切面而不需要修改主要逻辑,因此提高了代码的可维护性。

  3. 集中管理: AOP 将横切关注点集中管理,使得整个应用程序的行为变得更加集中和易于管理。通过定义切面和增强,可以方便地管理横切关注点的行为和执行顺序。

  4. 提高可重用性: AOP 提供了一种优雅的方式来管理横切关注点,使得这些功能可以在不同的地方重用。通过定义通用的切面和增强,可以轻松地将这些功能应用到不同的组件和模块中,提高了代码的可重用性。

Spring对AOP的一些操作

Spring 框架一般都是基于 AspectJ 实现 AOP 操作 ,AspectJ 不是 Spring 的组成部分,独立于 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,进行 AOP 操作。

基于 AspectJ 实现 AOP 操作

(1)基于 xml 配置文件实现

(2)基于注解方式实现

在项目中引入 AOP 的相关依赖,主要有:aop、cglib、aspectj、aopalliance等依赖。

切入点表达式

(1)切入点表达式作用:明确对哪个类里面的哪个方法进行增强。

(2)语法结构: execution(权限修饰符 返回类型 类全路径 方法名称(参数列表) )

相关推荐
Scott9999HH7 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔7 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社8 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海8 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖9 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大12 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai12 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说12 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json