详解Spring AOP篇一 - 指南

目录
AOP
AOP是Spring框架的第⼆⼤核⼼(第⼀⼤核⼼是IoC)。
那么什么是AOP呢?
AOP是Aspect Oriented Programming(⾯向切⾯编程)的缩写。
那么什么是⾯向切⾯编程呢?
切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程.
那么什么是Spring AOP呢?
AOP是⼀种思想, 它的实现⽅法有很多, 有Spring AOP,也有AspectJ、CGLIB等.
Spring AOP是其中的⼀种实现⽅式.
Spring AOP引入

现在有⼀些业务的执⾏效率⽐较低, 耗时较⻓, 我们需要对接⼝进⾏优化.
第⼀步就需要定位出执⾏耗时⽐较⻓的业务⽅法, 再针对该业务⽅法来进⾏优化
如何定位呢? 我们就需要统计当前项⽬中每⼀个业务⽅法的执⾏耗时.
如何统计呢? 可以在业务⽅法运⾏前和运⾏后, 记录下⽅法的开始时间和结束时间, 两者之差就是这个⽅法的耗时。

AOP就可以做到在不改动这些原始⽅法的基础上, 针对特定的⽅法进⾏功能的增强.
AOP的作⽤:在程序运⾏期间在不修改源代码的基础上对已有⽅法进⾏增强(⽆侵⼊性: 解耦)。
使用Spring AOP
引入AOP依赖
org.springframework.boot spring-boot-starter-aop
编写AOP程序
Aspect
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@Aspect
public class AspectTest {
/**
* 记录⽅法耗时
*/
@Around("execution(* com.wmh.springaop.controller.*.*(..))")
public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
//记录⽅法执⾏开始时间
long begin = System.currentTimeMillis();
//执⾏原始⽅法
Object result = pjp.proceed();
//记录⽅法执⾏结束时间
long end = System.currentTimeMillis();
//记录⽅法执⾏耗时
log.info(pjp.getSignature() + "执⾏耗时: {}ms", end - begin);
return result;
}
}
TestController
package com.wmh.springaop.controller;
import com.wmh.springaop.config.MyAspect;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RequestMapping("/test")
@RestController
public class TestController {
@RequestMapping("/t1")
public String t1(){
log.info("执行t1方法...");
return "t1";
}
}
运行结果

对上面的注解和方法的介绍
1. @Aspect: 标识这是⼀个切⾯类
2. @Around: 环绕通知, 在⽬标⽅法的前后都会被执⾏. 后⾯的表达式表⽰对哪些⽅法进⾏增强.
3. ProceedingJoinPoint.proceed() 让原始⽅法执⾏
整个代码划分为三部分:
方法执行前逻辑;
原始方法执行;
方法执行后逻辑。

我们通过AOP⼊⻔程序完成了业务接⼝执⾏耗时的统计.
AOP面向切面编程的优势
1. 关注点分离
提高代码清晰度:AOP通过引入“切面”的概念,将横切关注点(如日志记录、安全检查、事务管理等)从业务逻辑中分离出来,使得业务逻辑更加清晰、专注于核心功能。
降低耦合度:横切关注点与业务逻辑的分离,降低了不同模块之间的耦合度,提高了系统的模块化和可维护性。
2. 代码重用
提高开发效率:通过封装横切关注点为可重用的切面,避免了在多个模块中重复编写相同的辅助功能代码,提高了开发效率。
减少冗余代码:切面可以在多个位置被重用,减少了代码冗余,使代码更加简洁。
3. 系统可维护性增强
集中管理:将横切关注点封装在切面中,使得对这些功能的修改和增强可以在单一位置进行,简化了维护工作。
降低维护成本:由于关注点分离和代码重用,减少了因修改而引入新错误的风险,降低了系统的维护成本。
4. 灵活性提高
动态代理:AOP通常通过动态代理技术实现,在运行时动态地将切面应用到目标对象上,这使得系统具有更高的灵活性。开发者可以根据实际需求,动态地添加或移除切面。
易于扩展:当需要添加新的横切关注点时,只需定义新的切面并将其应用到相应的位置即可,无需修改现有的业务逻辑代码。
5. 易于测试
单元测试:由于业务逻辑中不再包含非核心代码(如日志记录、安全检查等),单元测试可以更加聚焦于业务功能本身,提高了测试的准确性和效率。
模拟特定情况:一些切面可能直接被禁用或用测试特定的实现替代,以便在测试环境中模拟特定情况。
6. 支持事务管理
简化事务处理:AOP提供了一种简化的事务管理机制,通过定义事务管理切面,可以轻松地声明哪些方法需要事务支持,同时避免了在业务代码中混入事务管理逻辑。
浙公网安备 33010602011771号