Spring:AOP通知获取数据(13)

news2024/11/26 4:32:36

AOP通知获取数据

  • AOP通知获取参数
    • 非环绕通知获取参数方式
    • 环绕通知获取参数方式
  • AOP通知获取返回值
    • 环绕通知获取返回值
    • 返回后通知获取返回值
  • AOP通知获取数据的案例

AOP通知获取参数

非环绕通知获取参数方式

在方法上添加JoinPoint,通过JoinPoint来获取参数, 这里只使用前置通知当做例子,其他都是一样的。

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
    private void pt(){}

    @Before("pt()")
    public void before(JoinPoint jp) 
    	// 使用JoinPoint调用getArgs方法获取参数信息
        Object[] args = jp.getArgs();
        System.out.println(Arrays.toString(args));
        System.out.println("before advice ..." );
    }
}

在这里插入图片描述

说明:

使用JoinPoint的方式获取参数适用于前置后置返回后抛出异常后通知。这里只举例了前置通知类型。

环绕通知获取参数方式

环绕通知使用的是ProceedingJoinPoint,因为ProceedingJoinPoint是JoinPoint类的子类,所以对于ProceedingJoinPoint类中应该也会有对应的getArgs()方法。

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
    private void pt(){}

    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp)throws Throwable {
        Object[] args = pjp.getArgs();
        System.out.println(Arrays.toString(args));
        Object ret = pjp.proceed();
        return ret;
    }
}

在这里插入图片描述
在这里插入图片描述

AOP通知获取返回值

对于返回值,只有返回后AfterReturing和环绕Around这两个通知类型可以获取,具体获取方式如下

环绕通知获取返回值

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
    private void pt(){}

    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        Object[] args = pjp.getArgs();
        System.out.println(Arrays.toString(args));
        args[0] = 666;
        // 获取原始方法返回值,如果有需要还可以对返回值ret进行修改
        Object ret = pjp.proceed(args);
        return ret;
    }
	//其他的略
}

返回后通知获取返回值

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
    private void pt(){}

    @AfterReturning(value = "pt()",returning = "ret")
    public void afterReturning(Object ret) {
        System.out.println("afterReturning advice ..."+ret);
    }
	//其他的略
}

注意:

(1) 参数名的问题

在这里插入图片描述

(2) afterReturning方法参数类型的问题

参数类型可以写成String,但是为了能匹配更多的参数类型,建议写成Object类型

(3) afterReturning方法参数的顺序问题

在这里插入图片描述

AOP通知获取数据的案例

需求: 对百度网盘分享链接输入密码时尾部多输入的空格做兼容处理。

  • 创建一个Maven项目

  • pom.xml添加Spring依赖

<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.4</version>
    </dependency>
  </dependencies>
  • 添加ResourcesService,ResourcesServiceImpl,ResourcesDao和ResourcesDaoImpl类
public interface ResourcesDao {
    boolean readResources(String url, String password);
}
@Repository
public class ResourcesDaoImpl implements ResourcesDao {
    public boolean readResources(String url, String password) {
        //模拟校验
        return password.equals("root");
    }
}
public interface ResourcesService {
    public boolean openURL(String url ,String password);
}
@Service
public class ResourcesServiceImpl implements ResourcesService {
    @Autowired
    private ResourcesDao resourcesDao;

    public boolean openURL(String url, String password) {
        return resourcesDao.readResources(url,password);
    }
}

  • 创建Spring的配置类
@Configuration
@ComponentScan("com.itheima")
@EnableAspectJAutoProxy
public class SpringConfig {
}
  • 编写通知类并添加环绕通知
@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(* com.itheima.service.ResourcesService.openURL(String, String))")
    private void servicePt(){}

    @Around("servicePt()")
    public Object trimStr(ProceedingJoinPoint pjp) throws Throwable {
        Object[] args = pjp.getArgs();
        System.out.println("去除空格前参数信息:" + Arrays.toString(args));
        // 去除参数两端的多余空格
        for(int i = 0; i < args.length; i++){
            // 判断是否为字符串类型
            if(args[i].getClass().equals(String.class)){
                args[i] = args[i].toString().trim();
            }
        }
        System.out.println("去除空格后参数信息:" + Arrays.toString(args));

        // 一定要方改为后的数组args,如果不把args传入的话,运行原始方法使用的还是原来的参数
        Object ret = pjp.proceed(args);
        return ret;
    }
}

  • 运行程序
public class App {
    public static void main(String[] args) {
        ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);
        ResourcesService resourcesService = act.getBean(ResourcesService.class);
        boolean flag = resourcesService.openURL("http://pan.baidu.com/haha", " root ");
        System.out.println(flag);
    }
}

在这里插入图片描述

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

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

相关文章

[附源码]Python计算机毕业设计出版社样书申请管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

源自双11混部实战,Koordinator 如何保障应用服务质量?

作者&#xff1a;张佐玮、韩柔刚 Koordinator 团队 在洪峰流量下&#xff0c;如何确保应用的服务质量不受影响的同时&#xff0c;最大限度提升资源利用率&#xff0c;是考验混部技术成熟度的关键。本文将展开介绍Koordinator在资源隔离&#xff0c;单机QoS保障&#xff0c;以及…

4、SySeVR复现——Generating slices

目录 1、准备阶段 2、生成实验数据的CFG图 3、生成实验数据的PDG图 4、生成实验数据的调用图 5、获取四种类型的SyVCs 6、提取SeVCs 7、获取漏洞的代码行号 8、给切片打标签 9、将标签写入切片 1、准备阶段 实验数据我只用这些&#xff1a; &#xff08;1&#xff09;…

Spring源码深度解析:六、ConfigurationClassPostProcessor

一、前言 文章目录&#xff1a;Spring源码分析&#xff1a;文章目录 ConfigurationClassPostProcessor是非常重要的一个 后处理器。 ConfigurationClassPostProcessor完成了 配置类的解析和保存以及Component注解、Import等注解的解析工作 。将所有需要注入的bean解析成BeanD…

【学习日志】2022.11.18 Technical Artist Training Tutorial----Unlit Shader Of Unity

着色器 - Unity 手册 (unity3d.com)https://docs.unity3d.com/cn/current/Manual/Shaders.html 常用板块&#xff08;Properties&#xff09; _MainTex("MainTex",2D)"black"{} _Float("Float",Float)0.0 _Range("Range",Range(0.0,1…

【测试沉思录】14. 性能测试中的系统资源分析之一:CPU

作者&#xff1a;马海琴 编辑&#xff1a;毕小烦 在日常的性能测试中&#xff0c;我们除了关注应用本身的性能&#xff0c;比如服务的响应时间、TPS 等&#xff0c;也需要关注服务器本身的资源使用情况&#xff0c;比如 CPU、内存、磁盘、网络等。当然&#xff0c;不光要分析服…

Java中string、int、char之间互相转换

String转int &#xff08;1&#xff09;Integer.parseInt(String) 方法 支持“负号”&#xff01; String str "123"; int num Integer.parseInt(str); 如果这个字符串中间有字母会报错&#xff01; &#xff08;2&#xff09;Integer.valueOf(String) 方法 …

白炽灯护眼还是LED护眼?2022年被央视315表扬的护眼灯

根据各方面对比下来&#xff0c;还是LED灯更护眼的&#xff0c;听我分析一下。 白炽灯是最早的出现的灯具&#xff0c;是由灯丝通电加热到白炽状态的&#xff0c;热辐射比较严重&#xff0c;灯光泛黄&#xff0c;并且白炽灯的光电转换效率低&#xff0c;费电&#xff0c;寿命太…

排序算法图解(六):归并排序

文章目录1 归并排序简介2 思路简介及图解3 代码实现写在最后1 归并排序简介 归并排序是建立在归并操作上的一种有效&#xff0c;稳定的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xf…

stm32cubemx hal学习记录:FreeRTOS软件定时器

一、配置过程 1、配置RCC、USART1、时钟84M 2、配置SYS&#xff0c;将Timebase Source修改为除滴答定时器外的其他定时器。 3、初始化LED的两个引脚、两个按键引脚 4、开启FreeRTOS&#xff0c;v1与v2版本不同&#xff0c;一般选用v1即可 5、打开定时器选项 6、创建两个定…

健身中心健身管理系统的设计与实现(源码+数据脚本+论文+技术文档)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

Mysql进阶学习(三)排序查询与常见函数

Mysql进阶学习&#xff08;三&#xff09;排序查询与常见函数一、进阶3&#xff1a;排序查询1、语法&#xff1a;2、特点&#xff1a;3、排序方式3.1、按单个字段排序3.2、添加筛选条件再排序案例&#xff1a;查询部门编号>90的员工信息&#xff0c;并按员工编号降序3.3、按…

基于SSM实现企业生资源管理系统-ERP系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

FlinkSql+Stream综合使用+广播流

Flink状态管理状态的分类Flink容错机制State Vs CheckPointCheckPoint原理State状态后端/State存储介质状态恢复和重启策略SavePointFlink TableAPI&SQL案例广播流状态管理 状态的分类 State ManagerState–开发中推荐使用&#xff1a;Flink自动管理/优化&#xff0c;支持多…

day 32 文件上传二次渲染.htaccess变异免杀

前言&#xff1a; #知识点&#xff1a; 1、文件上传-二次渲染 2、文件上传-简单免杀变异 3、文件上传-.htaccess妙用 4、文件上传-PHP语言特性 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整性&am…

拥抱 Spring 全新 OAuth 解决方案

以下全文 Spring Authorization Server 简称为: SAS 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护&#xff0c;该项目将不会再进行任何的迭代目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用 作为 SpringBoot 3.0 的…

设计文档编写要点

文章目录设计文档大致流程E-R关系图流程图UML图word制作目录设计文档大致流程 概要 表结构及其之间的关系&#xff08;E-R 图&#xff1a;实体-联系图 Entity Relationship Diagram&#xff09; 业务流程图、时序图&#xff08;按照人操作的维度&#xff09; 程序流程图、时序…

在X11图形环境下开启/关闭勿扰模式及其背后机制

开启/关闭勿扰模式 在Linux系统中、X11图形环境下&#xff0c;开启/关闭勿扰模式很简单&#xff0c;按照以下步骤操作即可&#xff1a; &#xff08;1&#xff09;鼠标左键点击右下角的“^”&#xff0c;即“显示隐藏的图标”。如下图所示&#xff1a; &#xff08;2&#xf…

退火算法研究分析

模拟退火算法采用类似于模拟退火的过程。先在一个高温状态下&#xff0c;逐渐退火&#xff0c;在每个温度下慢慢冷却&#xff0c;最终达到物理基态(相当于算法找到最优解&#xff09; 模拟退火算法属于贪心算法&#xff0c;在其过程中引入随机因素&#xff0c;以一定概率接收一…

Vue挂载(mount)和继承(extend)

vue.$mount 挂载 //index.html文件 <body><div id"app"></div> </body>//index.js文件 //1. 先看看普通的绑定 new Vue({el: #app,// el: document.getElementById(app) template: <div id"app">如果new Vue时候的option的…