谈及Spring框架中的aop可能并不是有所了解,在我们自己进行开发时,使用的场景可能很“少”。
那什么是AOP呢?
AOP(Aspect Oriented Programming) 意为 ‘面向切面编程’通过预编译和运行期间动态代理来实现程序功能的统一维护的一种技术。AOP思想是OOP(面向对象)的延续 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP中的基本单元是 Aspect(切面),AOP是软件行业的热点,也是Spring框架中的一个重要内容,是函数式编程的一种延伸范式。
其作用是:在不惊动原始设计的基础上为其进行功能增强。简单的说就是在不改变方法源代码的基础上对方法进行功能增强。
SpringAOP是基于动态代理进行实现的,可以说要进行了解SpringAOP我们就绕不开动态代理相关的知识代理
可以查看这篇博客进行了解
我们为什么要使用AOP?
我们可以利用AOP的思想来对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
在Spring AOP中业务逻辑仅仅只关注业务本身,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
AOP相当于一个拦截器,去拦截一些处理,例如:当一个方法执行的时候,Spring 能够拦截正在执行的方法,在方法执行的前或者后增加额外的功能和处理,就是我们希望通过使用AOP来对我们的代码进行耦合度的降低 把原本杂乱交错的关系给分离开来 进而改变这些行为的时候不会因为杂乱的关系互相影响。
AOP应该怎样使用?
老规矩导依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<scope>test</scope>
</dependency>
定义 aspect(切面)
@Aspect:作用是把当前类标识为一个切面供容器读取
如果一个类被打上了@Aspect就代表着他是一个切面类
当使用注解 @Aspect 标注一个 Bean 后, 那么 Spring 框架会自动收集这些 Bean, 并添加到 Spring AOP 中, 例如:

使用@Aspect 注解, 并不能将一个 Java 对象转换为 Bean, 因此我们还需要使用类似 @Component 之类的注解。使用 @Aspect 后, 这个类就会被排除在 auto-proxying(自动代理) 机制之外
声明 Pointcut (切入点)
一个 Pointcut 的声明由两部分组成:
一个方法签名, 包括方法名和相关参数
一个 Pointcut 表达式, 用来指定哪些方法执行是我们感兴趣的(即因此可以织入 Advice ).


接着我们使用增强方式进行实现一个简单的日志记录功能
@Aspect
@Component
public class LogControllerAop {
private static final Logger logger = LoggerFactory.getLogger(LogControllerAop.class);
@Pointcut("execution(* com.qcby.student.controller.*.*(..))")
public void Pointcut(){
}
@Before("Pointcut()")
public void before(JoinPoint joinPoint){
logger.info("前置方法执行,当前对象为:"+joinPoint.getTarget()+" 方法为:“+joinPoint.getSignature().getName()+” 参数为:"+ Arrays.toString(joinPoint.getArgs()));
}
}
我们将controller设置为切点并进行记录方法的执行

AOP的五种增强概念

前置增强
前置增强的特点包括:
- 执行时机:前置增强在目标方法执行之前执行,可以在目标方法执行之前干预和处理。
- 参数获取:在前置增强中可以获取目标方法的参数信息,并对参数进行校验或者使用参数进行一些预处理。
- 控制流程:通过前置增强可以决定是否继续执行目标方法,可以根据具体场景判断是否需要终止目标方法的执行。
使用前置增强可以实现以下功能:
- 参数校验:在前置增强中可以对目标方法的参数进行验证,确保参数满足要求,避免不合法的参数进入目标方法。
- 权限验证:前置增强可以用于验证用户的权限,检查当前用户是否有权执行目标方法。
- 日志记录:在前置增强中可以记录目标方法的调用信息,如方法名、参数值等,用于跟踪代码执行流程和排查问题。
- 缓存数据:在前置增强中可以检查缓存中是否存在所需数据,如果存在则直接返回缓存数据,避免执行耗时的数据库查询操作。
前置增强可以与其他增强概念结合使用,例如返回后通知、异常通知等,以实现更复杂的切面逻辑。通过AOP的前置增强,可以在目标方法执行前加入额外的处理逻辑,提高代码的可维护性和重用性。
后置增强
后置增强的特点包括:
- 执行时机:后置增强在目标方法成功执行并返回结果后执行,不会在目标方法抛出异常时执行。
- 获取返回值:在后置增强中可以获取目标方法的返回值,并进行相应的处理。
- 不会改变返回结果:后置增强不能修改目标方法的返回结果,只能对其进行处理或记录。
使用后置增强可以实现以下功能:
- 返回结果处理:可以对目标方法的返回结果进行一些后续处理,如数据加工、格式转换等。
- 日志记录:在后置增强中可以记录目标方法的执行结果或其他相关信息,用于跟踪代码执行流程和调试。
- 缓存数据:在后置增强中可以将目标方法的返回结果缓存起来,以提高后续相同请求的性能。
- 资源释放:后置增强可以用于执行一些资源的释放操作,例如关闭数据库连接、释放文件句柄等。
环绕增强
环绕增强的特点包括:
- 完全控制:环绕增强可以完全控制目标方法的执行,包括在目标方法执行前、执行后甚至替代目标方法的执行。
- 参数获取和修改:在环绕增强中可以获取目标方法的参数信息,并且有能力修改这些参数。
- 返回结果处理:环绕增强可以获取目标方法的返回结果,并且可以决定返回什么样的结果或者是否返回结果。
使用环绕增强可以实现以下功能:
- 性能监控:通过环绕增强可以统计目标方法的执行时间,收集性能指标,用于系统性能监控和优化。
- 事务管理:环绕增强可以在目标方法执行前后开启和提交事务,确保数据操作的一致性和完整性。
- 异常处理:通过环绕增强可以捕获目标方法抛出的异常,并根据需要进行处理、记录或者转换。
- 权限验证:在环绕增强中可以检查用户的权限,决定是否允许调用目标方法。
异常增强
异常增强的特点包括:
- 执行时机:异常增强在目标方法抛出异常后执行,不会在目标方法正常返回时执行。
- 获取异常信息:在异常增强中可以获取目标方法抛出的异常及其相关信息。
- 异常处理:异常增强可以对目标方法抛出的异常进行处理,例如记录日志、发送通知、回滚事务等。
使用异常增强可以实现以下功能:
- 异常处理与转换:通过异常增强可以捕获目标方法抛出的异常,并根据需要进行处理、记录或者将异常转换成其他类型的异常。
- 事务管理:异常增强可以在目标方法抛出异常时进行事务的回滚操作,保证数据的一致性和完整性。
- 异常通知:异常增强可以用于向管理员或用户发送异常通知,以便及时处理和修复问题。
最终增强
最终增强的特点包括:
- 执行时机:最终增强在目标方法执行完毕后执行,无论目标方法是否抛出异常。
- 无法获取返回结果:最终增强无法获取目标方法的返回结果,因为该结果在最终增强执行时已经确定或失效。
- 能够处理异常:最终增强可以捕获目标方法抛出的异常,并进行相应的处理或记录。
使用最终增强可以实现以下功能:
- 资源释放:最终增强可以用于执行一些资源的释放操作,例如关闭数据库连接、释放文件句柄等。
- 清理操作:最终增强可以用于执行一些清理操作,如清除临时文件、释放线程相关资源等。
- 异常处理:最终增强可以捕获目标方法抛出的异常,并执行相应的处理逻辑,以便进行错误处理或日志记录。

788

被折叠的 条评论
为什么被折叠?



