Springboot中使用AOP
创始人
2025-05-30 15:27:20
0

1. AOP术语说明

  1. 切面
    springboot中使用@Aspect注解标注的类,通俗地理解就是一个实现了要增强方法的增强操作的实现类,类中定义了增强方法执行前后等情况要进行的操作。

  2. 连接点
    表示AOP增强方法的执行,即被AOP切面类增强的方法。

  3. 通知
    表示连接点执行前后或遇到异常等情况要执行的操作,用不同的注解来表示,有如下5中通知类型:
    | 注解 | 描述 |
    | @Before | 前置通知, 在方法执行之前执行 |
    | @After | 后置通知, 在方法执行之后执行 |
    | @AfterReturn | 返回通知, 在方法返回结果之后执行|
    | @AfterThrowing | 异常通知, 在方法抛出异常之后 |
    | @Around | 环绕通知,围绕方法的执行 |

  4. 切入点
    匹配连接点的断言,表示要在什么样的方法进行AOP增强,形式如下:

execution(修饰符 返回值类型 方法名(参数)异常)

通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。

2. Springboot使用AOP

AOP常用来记录一些方法的执行日志,下面以记录控制类的执行日志为例子来说明Springboot如何使用AOP。

  1. 引入AOP依赖
org.springframework.bootspring-boot-starter-aop2.5.0
  1. 定义AOP注解
import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
public @interface LogAnnotation {String module() default "";String operator() default "";
}
  1. 定义切面类
@Component
@Aspect
@Slf4j
public class LogAspect {// 定义切点,表示被该注解注释的方法要被增强@Pointcut("@annotation(com.tplink.blog.common.aop.LogAnnotation)")public void pt() {}@Around("pt()")public Object around(ProceedingJoinPoint point) throws Throwable {long start = System.currentTimeMillis();// 执行原来的方法Object obj = point.proceed();long end = System.currentTimeMillis();// 保存日志recordLog(point, end - start);return obj;}// 记录日志private void recordLog(ProceedingJoinPoint point, long time) {// 获取署名信息对象MethodSignature signature = (MethodSignature)point.getSignature();// 通过反射获取Method对象Method method = signature.getMethod();// 获取方法上的注解对象LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);log.info("============================log start==========================");log.info("module:{}", annotation.module());log.info("operator:{}", annotation.operator());// 获取请求方法名String className = point.getTarget().getClass().getName();String name = signature.getName();log.info("request method:{}",className + "." + name + "()");// 请求参数Object[] args = point.getArgs();String params = JSON.toJSONString(args[0]);log.info("params:{}", params);// 获取ipHttpServletRequest request = HttpContextUtils.getServletRequest();log.info("ip:{}", IpUtils.getIpAddr(request));log.info("执行时间:{}ms", time);log.info("============================log stop==========================");}
}
  1. 定义控制类进行测试
@RestController
@RequestMapping("test")
public class TestController {private Logger logger = LoggerFactory.getLogger(TestController.class);@GetMapping("logAOP")@LogAnnotation(module = "AOP测试", operator = "进行日志AOP")public void testAOP(@RequestParam String param1) {logger.info("===============进行日志AOP================");}
}

执行结果如下:
在这里插入图片描述

相关内容

热门资讯

flink学习(scala版)... 1.1  环境准备         1.系统环境为Windows10。         2.需提前安...
思维导图模板怎么制作?提供几种... 思维导图是一种非常有用的图形化思维工具。它可以帮助我们更好地组织、整理和表达头脑中的想法。在学习中&...
四川九寨沟峨眉山旅游旅游团5天... 四川九寨沟峨眉山旅游团5天4晚费用多少钱,驴友亲测! 四川旅游推荐!当地导游-乐乐:185 8335...
四川九寨沟乐山大佛旅游攻略跟团... 四川的无限魅力:亲身体验之旅 四川旅游推荐!当地导游-乐乐:185 8335 5758(加他微信-立...
四川九寨沟峨眉山旅游跟团游五天... 标题:【亲测报告】四川九寨沟峨眉山五天四晚跟团游,驴友带你体验不一样的旅行! 四川旅游推荐!当地导游...
四川九寨沟峨眉山旅游小包团5日... 标题:四川九寨沟峨眉山5日游亲测,费用透明,乐乐带你玩转四川! 四川旅游推荐!当地导游-乐乐:185...
(Java)付账问题 付账问题一、题目二、输入输出三、代码及解析 一、题目 几个人一起出去吃饭是常有的事。 但在结帐的时候...
Vue基础27之VueUI组件 Vue基础27Vue UI组件库移动端常用 UI 组件库PC 端常用 UI 组件库Element-u...
lgsvl 现状 lgsvl自从2023年1月停服务以来,几乎就没有lgsvl最新的消息了,...
N9000B是德科技CXA信号... Keysight N9000B CXA 信号分析仪是当今用于基本信号表征的领先低成本工具。它的功能为...
一家人的晚餐,4个家常菜,做法... 这个周末小假,不打算出远门玩了。就在家周边走走,然后窝在家里追追剧。到了饭点,做几道家常菜,省了钱,...
原创 1... 在探索美食的无尽旅程中,酸奶以其独特的酸甜口感和丰富的营养价值,成为了许多人餐桌上的常客。然而,将这...
青海西宁:民众踩高跷跳锅庄过端... 5月31日,青海西宁,民众和游客观看高跷表演过端午。当日,“西海2261·河湟文化大集”西宁市湟中区...
Redis(十一):哨兵机制 前言 上一篇介绍了 Redis 的主从模式。这节开始介绍 Redis 的哨兵机制。 上一节提到的&#...
外国友人“拾趣YOUNG浦”,... 5月31日下午,一场以“拾趣YOUNG浦”之“香韵端午·画忆敦煌”为主题的活动在杨浦开展。以双语文化...
张家界今年来20万人次出入境 ... 华声在线5月31日讯(全媒体记者 李毅 通讯员 卢治豪 向颖)记者5月31日从湖南出入境边防检查总站...
Java大型医院电子病历管理系... ▶ 电子病历(Electronic Medical Record,简称E...
C语言函数大全--c开头的函数... C语言函数大全 本篇介绍C语言函数中 c 开头的函数之复数篇 1. cabs,cabs...
乡村游受追捧 仪征黑莓小镇迎来... 随着农文旅融合发展的深入推进,乡村游越来越受到欢迎。今天(5月31日)上午,记者在仪征马集镇黑莓小镇...