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([权限修饰符] [返回类型] [类全路径] [方法名称]([参数列表]) )

相关推荐
直奔標竿1 分钟前
Java开发者AI转型第十三课!知识库终局方案:Spring AI Vector Store架构演进与ETL全链路入库实战
java·人工智能·后端·spring
MarkHD2 分钟前
调度、监控与部署:Python自动化任务全栈实践
开发语言·python·自动化
XiYang-DING3 分钟前
【Java EE】阻塞队列(BlockingQueue)
java·java-ee
山甫aa4 分钟前
多叉树定义与遍历-----从零开始的数据结构
开发语言·c++·二叉树·多叉树
永远睡不够的入7 分钟前
C++11新特性(2):深入 C++ 参数传递黑盒:从引用折叠到完美转发,再到可变参数模板
开发语言·c++
AndreasEmil9 分钟前
基于多设计模式的抽奖系统 - 测试报告
java·selenium·设计模式·postman
无限进步_12 分钟前
【C++】寻找数组中出现次数超过一半的数字:三种解法深度剖析
开发语言·c++·git·算法·leetcode·github·visual studio
深邃-12 分钟前
【Web安全】-Kali,Linux配置(1):Kali网络配置,LinuxEnvConfig配置脚本,APT源的讲解,Kali设置中文
linux·运维·开发语言·网络·安全·web安全·网络安全
Hello World . .13 分钟前
Linux驱动编程:内核同步的艺术-从互斥到底半部
linux·开发语言·数据库
江山与紫云14 分钟前
告别重复造轮子:Codex写脚本
开发语言·python