AOP用法 概念

目录

AOP 的核心概念

AOP 的应用场景

AOP 在 Java 中的应用

Spring AOP

AOP 的优缺点

优点

缺点

总结

@args 注解的使用场景

增强器链:

AOP的底层原理

Java 中的方法全签名

多切面执行(套娃 代理对象套代理对象)


AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它旨在将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,以便更好地模块化这些关注点。横切关注点是指那些贯穿多个业务功能的公共行为,如日志记录、事务管理、权限验证等。

AOP 的核心概念

  1. 切面(Aspect):代表一个横切关注点的模块化。切面封装了影响多个类的行为。例如,日志记录、安全性检查等。
  2. 连接点(Joinpoint):程序执行过程中的某个特定位置,例如方法执行前后、异常抛出前后等。切面会在这些连接点处插入自己的行为。
  3. 通知(Advice):切面在特定连接点上执行的动作。根据执行时机的不同,通知可以分为前置通知、后置通知、环绕通知等。
  4. 切入点(Pointcut):定义了哪些连接点将会执行通知。它是切面与连接点的交集。
  5. 引入(Introduction):声明新的类型或方法,通常是向现有类添加新的行为或属性。
  6. 织入(Weaving):将切面代码插入到应用程序中,可以在编译时、加载时或运行时进行。

AOP 的应用场景

  1. 日志记录:在方法执行前后记录日志信息。
  2. 事务管理:在方法调用前后自动管理事务。
  3. 权限验证:在执行敏感操作之前进行权限检查。
  4. 性能监控:在方法执行前后记录执行时间和资源消耗。
  5. 异常处理:在方法抛出异常时进行统一处理。
  6. 缓存机制:在方法执行前后进行缓存的更新和查询。

AOP 在 Java 中的应用

在 Java 中,最流行的 AOP 框架是 Spring AOPAspectJ

Spring AOP

Spring AOP 是 Spring 框架的一部分,它提供了声明式的 AOP 支持,主要通过 XML 或注解来配置切面。

AOP 的优缺点

优点
  1. 模块化:将横切关注点从业务逻辑中分离,提高了代码的可维护性和可重用性。
  2. 解耦:减少业务逻辑与横切关注点之间的耦合,使得代码更易于扩展和修改。
  3. 透明性:切面逻辑对于业务逻辑是透明的,不需要在业务逻辑中显式调用。
缺点
  1. 学习曲线:AOP 相对于传统的面向对象编程有一定的学习曲线。
  2. 调试困难:由于切面逻辑不是显式调用的,因此在调试时可能需要额外的工具支持。
  3. 性能开销:AOP 框架需要在运行时进行织入操作,可能会引入一定的性能开销。

总结

AOP 是一种编程范式,它通过将横切关注点从业务逻辑中分离出来,提高了代码的模块化程度和可维护性。在 Java 中,Spring AOP 和 AspectJ 是两个广泛使用的 AOP 框架。通过合理应用 AOP,可以更好地组织和管理复杂的分布式系统。

告诉Spring,以下通知何时何地运行?
何时?
@Before:方法执行之前运行。
@AfterReturning:方法执行正常近回结果运行。
@AfterThrowing.方法抛出异常运行。
@After.方法执行之后运行
何地

@args 注解的使用场景

假设你有一个自定义的注解 MyAnnotation,并且你想根据方法参数是否带有这个注解来决定是否应用某个切面逻辑。在这种情况下,你可以使用 @args 注解来定义切入点。

因为string param有@MyAnnotation,当doSomething被执行时,

@Pointcut 注解用于定义一个切入点表达式,该表达式指定了哪些连接点将被切面所影响。通过定义切入点表达式,我们可以精确地控制切面中的通知(advice)应该在哪些方法调用前后执行。在上述例子中,myPointcut 定义了一个切入点,它匹配 com.atguigu.spring.aop.service 包下所有类的所有方法,从而确保在这些方法执行之前可以执行前置通知(beforeAdvice)。这种方法可以使代码更加模块化,并减少业务逻辑中的横切关注点(cross-cutting concerns)。

增强器链:

切面中的所有通知方法其实就是增强器。他们被组织成一一个链路放到集合中。目标方法真正执行前后,会去增强器链中执行哪些需要提前执行的方法。

AOP的底层原理


1. Spring会为每个被切面切入的组件创建代理对象(Spring CGLIB创建的代理对象,无视接口)。
2.代理对象中保存了切面类里面所有通知方法构成的增强器链。
3.目标方法执行时,会先去执行增强器链中拿到需要提前执行的通知方法去执行

Java 中的方法全签名

在 Java 中,方法的全签名是由方法名和参数列表组成的。参数列表包括参数的类型和顺序,但不包括参数的名字。具体来说,两个方法如果具有相同的名称和相同顺序的参数类型,那么它们被认为是具有相同的签名,即使它们有不同的返回类型或参数名字。

多切面执行(套娃 代理对象套代理对象)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值