SpringBoot实践(三十九):如何使用AOP

news2025/2/28 15:05:33

目录

直接使用@Aspect

定义切面逻辑

模拟业务代码

测试输出

 自定义注解方式

自定义切面注解

定义切入点逻辑

模拟业务代码

测试输出


面向切面(AOP) 是spring重要特性,在功能上切面编程是面向对象编程的很好的补充,面向对象强调封装和开闭原则,如果多个对象有通用行为和方法,将造成很多冗余代码,AOP将通用功能作为切面插入到业务逻辑中(如通用的日志打印,异常处理,license判断等)抽取通用逻辑,减少代码冗余,并且无侵入地修改代码,在实现层面上都是通过动态代理实现,默认cglib方式,SpringBoot简化了它的使用,常用的2种方式:直接使用aspect注解扫描或基于自定义的注解。

首先在springBoot的依赖管理基础上,引入aop的依赖:

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

直接使用@Aspect

定义切面逻辑

使用@Aspect实现一个通用的业务逻辑,比如日志打印,提供了几种切面增强方式:前置增强@Before,后置增强@After,环绕返回@AfterReturning,环绕增强@Around(前后都有),异常抛出增强AfterThrowing,执行顺序是:

  1. 正常情况:@Around-->@Before-->目标方法执行-->@AfterReturning-->@After-->@AfterReturning-->@Around
  2. 异常情况:@Around-->@Before-->目标方法执行-->@AfterThrowing-->@After-->AfterThrowing-->@Around

 如下:

@Component
@Aspect
@Slf4j
public class LoggingAspect {
    @Pointcut("execution(public * com.example.hello.controller.*.*())")
    public void LogAspect(){}
    @Before("LogAspect()")
    public void doBefore(JoinPoint joinPoint){
        log.info(" -------------------------> this is before.");
    }
    @After("LogAspect()")
    public void doAfter(JoinPoint joinPoint){
        log.info(" -------------------------> this is after.");
    }
    @AfterReturning("LogAspect()")
    public void doAfterReturning(JoinPoint joinPoint){
        log.info(" -------------------------> this is afterReturning.");
    }
    @AfterThrowing("LogAspect()")
    public void deAfterThrowing(JoinPoint joinPoint){
        log.info(" -------------------------> this is deAfterThrowing.");
    }
    @Around("LogAspect()")
    public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{
        log.info(" -------------------------> this is deAround.");
        return joinPoint.proceed();
    }
}

模拟业务代码

这里的切入点是controller类中方法,controller的方法定义如下,其中helloService模拟的是真实的业务代码,这个controller不需要做任何修改,测试正常输入和异常输出;

    @GetMapping("/hello")
    public String sayHello(){
        log.info("---- 模拟基于标准注解的切面过程 ---------- >running hello");
        return helloService.sayHello();
    }

    @GetMapping("/hello2")
    @LogAnnotation(param = "HelloController")
    public String sayHello2(){
        log.info("---- 模拟异常后切面过程 ---------- >running hello2");
        throw new RuntimeException();
    }

测试输出

 在正常输出业务代码的前后,及方法的全局都被注入了自定义的逻辑: 

异常输出:

 自定义注解方式

上面的方式可以无侵入地为我们的业务代码增加某些通用逻辑,同时我们也可以自定义注解方式,然后将自定义注解增加到部分业务代码中;

自定义切面注解

定义注解LogAannotation,能够在方法和类上标注,有个参数param默认空;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface LogAnnotation {
    String param() default "";
}

定义切入点逻辑

LoggingAspect2实现了切入点和自定义注解@LogAnnotation的逻辑,在切入点前后执行时间打印;

@Aspect
@Component
@Slf4j
public class LoggingAspect2 {

    @Around("@annotation(logAnnotation)")
    public Object around(ProceedingJoinPoint joinPoint, LogAnnotation logAnnotation) throws Throwable {
        log.info(String.format("time now :%s",new Date()));
        Object o = joinPoint.proceed();
        log.info(String.format("time now :%s",new Date()));
        return o;
    }
}

模拟业务代码

这种方式需要修改业务代码,增加对于自定义注解的传参;

    @GetMapping("/hello3")
    @LogAnnotation(param = "HelloController")
    public String sayHello3(){
        log.info("---- 模拟基于自定义注解的切面 ---------- >running hello3");
        return helloService.sayHello();
    }

测试输出

这里因为上面的@aspect注解增加了环绕增强,因此hello3的上下日期打印是自定义注解的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BAT 名企大厂做接口自动化如何高效使用 Requests ?

1080428 28.9 KBRequests是一个优雅而简单的python HTTP库&#xff0c;其实python内置了用于访问网络的资源模块&#xff0c;比如urllib&#xff0c;但是它不如requests简单&#xff0c;优雅&#xff0c;而且缺少许多实用功能。接下来的接口测试的学习和实战&#xff0c;都与re…

语音识别系列之基于CTC的VAD

语音活动性检测&#xff08;Voice Activity Dection, VAD&#xff09;常作为语音识别系统的前端模块过滤非语音段&#xff0c;为后续增强模块提供语音/非语音判据&#xff0c;从而更好的掌握背景噪声特性&#xff0c;进而提升降噪量&#xff0c;保证识别性能&#xff0c;且能降…

GitHub进阶使用指南

GitHub进阶使用指南1.个性化 Github 首页2.自定义项目徽章3.自动为项目添加贡献情况图标4.高效阅读 Github 项目的源代码5.扩展 Github 的功能1.个性化 Github 首页 Github 目前支持在个人主页自定义展示一些内容&#xff1a; 想要做到这样非常简单&#xff0c;你只需要创建一…

创建切实可行的项目管理计划会带来什么好处?

项目管理计划是深入了解项目来龙去脉的地方&#xff0c;可以说是指导你从头到尾完成项目的地图。 项目章程是项目的高层次愿景&#xff0c;而项目管理计划将这一愿景分解为项目的实际日常执行&#xff0c;涵盖为实现项目目标所需要做的一切。 一个详细的项目计划将规划出从…

Java自动拆装箱与缓存——Java中的128陷阱

在讲解128陷阱之前&#xff0c;需要了解一些概念。 包装器类型 Java是面向对象的语言&#xff0c;但基本类型并不是面向对象的&#xff0c;从而出现了包装器类型&#xff0c;并且包装器添加了更多的属性和方法。如我们在使用集合类型Collection的时候就一定要使用包装类型而非…

高等学校学生公寓消防安全设计及管理设计要点

摘要&#xff1a;高等学校学生公寓是学生生活起居和日常活动的重要场所&#xff0c;具有人员同时聚集的特征&#xff0c;属于人员密集场所。特别是晚间休息时&#xff0c;此时宿舍内人员达到满员状态。学生的生活及学习物品&#xff0c;如被褥、衣服、书籍等&#xff0c;都属于…

Prometheus标签的使用说明

prometheus在处理数据指标的过程中&#xff0c;包括【抓取的生命周期】和【标签的生命周期】 默认情况下&#xff0c;当prometheus加载target实例完成后&#xff0c;这些target时候会包含一些默认的标签&#xff0c;这些标签将会告诉prometheus如何从target实例中获取监控数据…

【3】Linux多节点部署KubeSphere|最简单的安装方法

目录 步骤1&#xff1a;准备三台服务器 步骤2&#xff1a;下载KubeKey 步骤3&#xff1a;创建集群 1. 创建示例配置文件 2. 编辑配置文件 3. 使用配置文件创建集群 4. 验证安装 步骤1&#xff1a;准备三台服务器 4c8g (master)8c16g * 2 (worker)centos7.9内网互通每个机…

Tiktok的发展趋势以及政策支持,你了解多少?

武汉瑞卡迪电子商务有限公司&#xff1a;为了方便大家的阅读&#xff0c;这篇文章将分为以下几个板块&#xff1a; 1、Tiktok的基本介绍 2、Tiktok的发展趋势以及政策支持 3、新手运营Tiktok的方法 4、Tiktok引流的方法 一、Tiktok的基本介绍 TikTok TikTok国际版&#xf…

express 1.1安装express And 1.2创建项目

目录 1.1安装express 1.2.1 创建项目 &#xff08;1&#xff09;使用vscode&#xff0c;可以快速创建项目&#xff0c;vscode把终端聚合在了一起&#xff0c;打开vscode终端 &#xff08;2&#xff09;进入工作目录 &#xff08;3&#xff09;执行创建命令 &#xff08;4&…

MySQL必知必会_SELECT部分

最近在读MySQL必知必会&#xff0c;关于这本书打算写点读后感&#xff0c;大概是两篇博客的体量。 其实对于测试岗来说&#xff0c;不管是面试还是实际工作中&#xff0c;最重要的自然当属SELECT。 下面我把书里关于SELECT的知识点简单记一下吧。 首先在MySQL中其实是不区分…

【MySQL】第二部分 MySQL的启动和登录

【MySQL】第二部分 MySQL的启动和登录 文章目录【MySQL】第二部分 MySQL的启动和登录2. MySQL的启动和登录2.1 服务的启动与停止2.2 客户端登录查看版本信息退出登录2.3 演示命令行的使用总结2. MySQL的启动和登录 2.1 服务的启动与停止 MySQL的安装就不过多介绍了,大家可以去…

OpenSceneGraph纹理API开发指南【OSG】

前面的教程中&#xff0c;我们用彩虹的所有颜色画了一个正方形。然而&#xff0c;还有另一种成为纹理映射的技术&#xff0c;将光栅二维图像应用于三维几何。在这种情况下&#xff0c;效果不是针对几何体的顶点&#xff0c;而是通过栅格化场景更改获得的所有像素的数据。这种技…

好雨科技加入龙蜥 完成与 Anolis OS 兼容适配

近日&#xff0c;北京好雨科技有限公司&#xff08;以下简称“好雨科技”&#xff09;签署了 CLA&#xff08;Contributor License Agreement&#xff0c;贡献者许可协议&#xff09; &#xff0c;正式加入龙蜥社区&#xff08;OpenAnolis&#xff09;。好雨科技成立于 2015 年…

bug总是多不如看一看,前端写完代码进行的自测流程减少bug重复反工,提高开发效率。

提测标准&#xff1a;修改bug前要熟知之前的操作逻辑以及涉及其代码的周边逻辑&#xff0c;修改bug后的操作逻辑和测试确认&#xff0c;检测其它周边逻辑。至少需要另外1个开发进行交叉测试必要时进行代码Code Review&#xff08;代码规范&#xff0c;主要逻辑&#xff0c;复杂…

服务器SMTP邮件设置

服务器SMTP邮件设置 在服务器设置登录验证时需要绑定一个自动收发邮件的服务器进行验证 这时候就要对STMP进行配置&#xff0c;如下 填写的主机为邮件对应的主机 腾讯QQ邮箱 POP3&#xff1a;pop.qq.com SMTP&#xff1a;smtp.qq.com IMAP&#xff1a;imap.qq.com 端口&…

1.13

周报 完善案例 ​ this.$nextTick(function () {this.$refs.input.focus()})}​ //点击编辑直接获取焦点 this.$refs.input.focus() //但是这种写法 由于input是用v-show控制的 所以执行了上面代码 改变了isEdit值 但是不会立马去重新解析模板 input框还没有出来 //将handleed…

算法第十期——DFS(深度优先搜索)的剪枝优化

目录 DFS:剪枝 DFS:有哪些剪枝方法 DFS例题一&#xff1a;剪格子 【思路】 DFS例题二&#xff1a;路径之谜 【样例分析】 DFS例题三&#xff1a;四阶幻方 【思路】 【做法一】 【做法二】 DFS例题三&#xff1a;分考场 【样例分析】 【思路】 DFS习题 DFS:剪…

TPM零知识学习十一 —— tpm全安装流程复盘(下)

接前一篇文章《TPM零知识学习十 —— tpm全安装流程复盘&#xff08;中&#xff09;》&#xff0c;链接为&#xff1a; TPM零知识学习十 —— tpm全安装流程复盘&#xff08;中&#xff09;_蓝天居士的博客-CSDN博客 五、TPM模拟器做成服务 本步骤前导步骤参见 《TPM零知识学…

Docker——网络配置

目录 本次目标&#xff1a; 一、Docker网络配置 1.bridge模式(默认模式) 2.host模式 二、bridge模式 三、host模式 网络模式与数据卷容器挂载的操作 四、如何创建自定义网络 本次目标&#xff1a; Docker网络配置Docker部署SpringCloud项目 一、Docker网络配置 Dock…