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

相关推荐
m0_5719575840 分钟前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
一点媛艺2 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风2 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生3 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功3 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2343 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨3 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程3 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk4 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*4 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go