SpringBoot 之 AOP

news2024/11/22 21:56:21

前言:

        Spring 三大核心思想是啥,还记得不?IOC(控制反转),DI(依赖注入),AOP(面向切面编程)。回顾一下这三个东西:

        IOC:不考虑使用 Spring,纯手写 java 程序时,对象之间的使用和依赖完全是由程序员手写代码控制的,何时创建对象完全在代码中标明。IOC 是一种编程思想,它的核心作用就是把对象的创建、管理由人工负责转成 Spring 托管。

        DI:IOC的核心思想很好,那么怎么实现呢?DI就是实现IOC的方案,例如常见的 @Value、@Resource、@Autowired 注解、配置文件都是最具体的使用样例。

        AOP:简单点说就是,把某个核心方法切开看看能不能加点其他处理逻辑。

一、相关注解

@Aspect描述这是一个切面类
@Pointcut定义一个切面,所关注事件入口
@Before切入方法执行前干什么
@Around切入方法执行时的增强处理,慎用
@After切入方法执行后后干什么
@AfterReturning对切入方法返回数据的增强处理
@AfterThrowing切入方法抛出异常时的处理

二、常用注解说明

常用注解三个:Before、After、Pointcut

切面类:

@Slf4j
@Aspect
@Component
public class AopTest {

    @Pointcut("execution(* quancheng.demo.service..TestService.test(..))")
    public void pointFun() {
    }

    @Before("pointFun()")
    public void doB() {
        log.info("Before doB...");
    }

    @After("pointFun()")
    public void doA() {
        log.info("After doA...");
    }

}

切入的类和方法:

@Slf4j
@Service
public class TestService {

    public String test(String str) {
        log.info("test service......{}", str);
        return str;
    }
    
}

运行时日志截图:

PointCut 定义了一个切面,该注解有两个表达式:

1. execution 表达式

execution(* quancheng.demo.service..TestService.test(..))

* :表示返回值类型,* 表示所有类型;

quancheng.demo.service:这是一个包名,标识需要拦截的包;

包名后的 ..:表示当前包和所有其子包,在本例中指 quancheng.demo.service 包和其子包下所有类;

TestService :表示具体的类名,如果是 * 表示所有类;

test(..) :test是具体方法名,可以用 * 表示所有的方法;后面括弧里面表示方法的参数,双点表示任何参数;

2.@annotation 表达式(推荐使用

@annotation(quancheng.demo.aop.anno.ServiceDeal)

@annotation 的参数是一个注解的全类限定名,可以自定义也可以使用现有的注解;
quancheng.demo.aop.anno.ServiceDeal 是自定义的注解;

切面类样例如下:

@Slf4j
@Aspect
@Component
public class AopTest {

    @Pointcut("@annotation(quancheng.demo.aop.anno.ServiceDeal)")
    public void pointFan() {
    }

    @Before("pointFan()")
    public void doB() {
        log.info("Before doB...");
    }

    @After("pointFan()")
    public void doA() {
        log.info("After doA...");
    }
}

切面类的自定义注解:

@Target({ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceDeal {
    String value() default "";
}

使用样例:

@Slf4j
@Service
public class TestService {

    @ServiceDeal
    public String test1(String str) {
        log.info("test1 service......{}", str);
        return str;
    }
}

三、增强处理注解

增强处理注解:AfterReturning、AfterThrowing、Around

1.AfterReturning

这个只能加些处理逻辑,对修改返回无能为力。

@Slf4j
@Aspect
@Component
public class AopTest {

    @Pointcut("@annotation(quancheng.demo.aop.anno.ServiceDeal)")
    public void pointFan() {
    }

    @Before("pointFan()")
    public void doB() {
        log.info("Before doB...");
    }

    @After("pointFan()")
    public void doA() {
        log.info("After doA...");
    }

    @AfterReturning(pointcut = "pointFan()", returning = "result")
    public void dealReturn(String result) {
        log.info("打印返回值:{}", result);
    }

}

输出截图:

注意:returning 的值要跟参数的属性保持一致,要不会报错。

2.AfterThrowing

service 加个会抛出异常的方法:

    @ServiceDeal
    public String test1(String str) {
        Integer i = Integer.valueOf(str);
        log.info("test1 service......{}", str);
        return str;
    }

切面方法处理异常:

    @AfterThrowing(pointcut = "pointFan()", throwing = "e")
    public void dealException(Throwable e) {
        log.info("打印报错:{}", e.getStackTrace());
    }

输出截图:

 3.Around

        当定义一个 Around 增强处理方法时,该方法的第一个形参必须是 ProceedingJoinPoint 类型。在增强处理方法体内,调用 ProceedingJoinPoint 的 proceed 方法才会执行目标方法;调用 ProceedingJoinPoint 的 proceed 方法时,还可以传入一个 Object[] 对象,该数组中的值将被传入目标方法作为实参,这就是 Around 增强处理方法可以改变目标方法参数值的关键,当然传参类型和数量是必须跟实际方法一致。

    @Around("pointFan()")
    public Object process(ProceedingJoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        log.info("原始传参 args:{}", args);

        Object result = null;
        try {
            //修改传参
            result = joinPoint.proceed(new Object[]{"newArgs"});
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        log.info("数据返回:{},这块可以加些处理逻辑", result);

        return result;
    }

输出截图:

传参和结果都可随意修改,所以这块慎用。

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

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

相关文章

Dash初探:如何将Label和Dropdown放在一行

Use Dash! How to display html.Lable and dcc.Dropdown on the same line? 1、目标 下图展示了我想要实现的效果。 数据筛选部分包含了三个筛选条件:日期区间选择器;区域选择器;地市选择器。其中,地市选择器的取值和已选区域…

【1805. 字符串中不同整数的数目】

来源:力扣(LeetCode) 描述: 给你一个字符串 word ,该字符串由数字和小写英文字母组成。 请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123 34 8 34" 。注意…

[附源码]JAVA毕业设计砂石矿山管理系统(系统+LW)

[附源码]JAVA毕业设计砂石矿山管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

如何将Word转成PDF格式?这三种方法总有一个适合你

如何把Word文档转换成PDF文件格式呢?大家在传输文件的时候,相信很多小伙伴都喜欢不使用PDF文件格式,因为它非常的稳定,在浏览文件的时候格式不会乱,但我们都是先做好Word文档,然后再把它转成PDF格式&#x…

诗人贺伟陪你看世界杯

国内三大拥有转播权的主流平台(央视、中国移动咪咕和抖音)都已经公布了解说阵容 CCTV解说阵容 贺炜、刘嘉远、朱晓雨、曾侃、李晨明、孙思辰、邵圣懿。 此次央视世界杯采取了“单口”解说的模式,这多少还是会让球迷们感到错愕。以往的足球盛…

ubuntu+Docker双容器docker-compose部署Django+Vue项目(2-Django)

文章目录部署Django后端接口下载Python环境及一些尝试pip包管理运行项目容器报错1(查询容器IP解决)报错2(pvsite_uwsgi.ini文件配置socket还是http)报错3(用http先)用python manage.py runserver运行项目先报错4(下载cryptography库)回到用uwsgidjango运行成功先在uwsgidjango中…

FT2004(D2000)开发实战之PBF配置

一 PBF概述 PBF英文全称Phytium Base Firmware,PBF主要作用: 初始化PLL设置CPU主频初始化DDR4初始化PCIe控制器初始化全局中断和定时器跳转到U-boot 飞腾FT2004芯片BIOS固件由两部分构成,PBF+U-boot或者PBF+UEFI,最终的BIOS烧写⽂件由PBF固件包中的脚本程序⽣成,当然在生…

为什么消费返利模式层出不穷?这个消费返利玩法值得你借鉴

大家好,我是林工,不知道大家听说过消费返利没有?消费返利是互联网常见的一个商业模式,是指互联网平台将自己所销售的商品和服务让渡给消费者并获得一定比例的报酬,消费者通过平台享受到的佣金和消费总额(金…

正则表达式简介

一、介绍 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字…

观察|数字营销正当时,企业如何玩转短视频?

​​双十二购物狂欢节即将来临,从手机APP的开屏广告到线下随处可见的广告屏,铺天盖地的短视频成为各大品牌宣传造势的重头戏。凭借具有强烈视觉冲击力的画面和魔性的配音配乐,短视频已然超越传统图文广告,迅速成长为占领受众心智的…

Java数据结构与Java算法学习Day05---二叉树(简略笔记记录)

目录 一、二叉树 79 1.1树的基本定义79 1.2数的相关术语 80 1.3二叉树的基本定义 81 1.4二叉查找树的创建 82 1.4.1二叉树查找树创建---插入方法(put) 83 1.4.2二叉树查找树创建---获取方法(get)84 1.4.3二叉树查找树创建…

大数据学习:进程管理(2)

文章目录一、系统资源监控1、free命令2、uname命令3、uptime命令4、netstat命令5、vmstat命令二、任务管理1、前台进程2、后台进程3、操作案例一、系统资源监控 1、free命令 观察内存(memory)使用情况 2、uname命令 查阅系统与核心相关信息 3、up…

JavaEE技术点:MySQL目录及基本命令介绍

1.MySQL目录介绍 (1)首先来看MySQL的安装目录,如图1-1所示: 图1-1 MySQL的安装目录 (2)图1-1中的bin目录中存放的是二进制的可执行文件,如图1-2所示: 图1-2 bin目录结构 (3)图1-2中的mysqld.exe是服务器程序,必须先…

山东:推进自然资源确权登记 助力自然资源保护发展

2019年,自然资源统一确权登记工作启动以来,山东省认真贯彻生态文明思想,坚决扛牢政治责任,按照国家统一部署,担当作为、加压奋进,在探索推进自然资源确权登记法治化、规范化、标准化、信息化等方面取得了积…

用亚马逊自养号进行测评的好处

自养号顾名思义就是自己用真实环境养出来的买家账号。通过真实的邮箱、手机号码和注册地当地真实收货地址,包括IP等等,但是也有很多卖家没有完全认清自养号的好处,下面就看看用亚马逊自养号进行测评的好处 对于卖家来说,使用自养号…

【超全面】机器学习中的超参优化方法总结

目录 1. 什么是超参数 2. 超参数类型 3. 主流超参优化方法 (1)手动调参 缺点: python代码:(例子) 手动调参 参数的重要性顺序 超参具体如何影响模型性能 超参合适的范围 (2)网格搜索 …

Web3中文|马斯克也疯狂?网红AI “ChatGPT”有多火?

一个名为“ChatGPT”的网红AI竟写出了毁灭人类的计划书。 计划书的步骤详细到入侵各国计算机系统、控制武器、破坏通讯、交通系统等等。和电影里的情节一模一样,甚至ChatGPT还给出了相应的Python代码。 诱导ChatGPT写下该计划的是一位名为扎克德纳姆(Z…

使用 Echarts 插件完成中国旅游地图

目录前言:什么是 Echarts 插件具体实现思路中国旅游地图成品展示步骤:完成中国旅游地图代码总结:前言: 大家都知道,一般情况下,想要使用前端设置一个 中国旅游地图 需要使用 canvas 画布进行编写&#xff…

尿苷二磷酸修饰阿拉伯糖,阿拉伯糖偶联核苷酸,UDP-B-L-阿拉伯糖二钠盐,15839-78-8

产品名称:尿苷二磷酸修饰阿拉伯糖,阿拉伯糖偶联核苷酸 英文名称:UDP-b-L-arabinopyranose disodium salt,UDP-L-Arabinose CAS号:15839-78-8 分子式:C14H22N2O16P2 分子量:536.27600 产地&am…

一种基于交叉选择的柯西反向鲸鱼优化算法QOWOA附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …