当前位置: 首页 > news >正文

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

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);
    }
}

在这里插入图片描述

相关文章:

  • 使用 Spring Boot 设置 Hibernate Envers
  • 【数据结构】带头节点双向循环链表
  • 原来 GitHub 不仅能学代码,还有这些东西
  • 【动手学深度学习】softmax回归的从零开始实现(PyTorch版本)(含源代码)
  • 为了摸鱼,我开发了一个工具网站
  • Qt编写ERP库存库房发货电子看板
  • 「PAT乙级真题解析」Basic Level 1086 就不告诉你 (问题分析+完整步骤+伪代码描述+提交通过代码)
  • Python函数详解(三)——函数的参数传递进阶
  • 渗透测试CTF-图片隐写的详细教程2(干货)
  • Python3,os模块还可以这样玩,自动删除磁盘文件,非必要切勿操作。
  • 视频分析:走路看手机行为
  • 国内家具行业数据浅析
  • 聚观早报 | 推特临时培训员工应对世界杯;世界杯足球内置传感器
  • Spring Boot——yml和properties详解
  • 【总结】Idea 编译maven项目报错NoSuchMethodError DefaultModelValidator
  • 03Go 类型总结
  • CEF与代理
  • echarts花样作死的坑
  • js中forEach回调同异步问题
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python语法速览与机器学习开发环境搭建
  • vuex 笔记整理
  • Vue全家桶实现一个Web App
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 高度不固定时垂直居中
  • 搞机器学习要哪些技能
  • 如何解决微信端直接跳WAP端
  • 如何实现 font-size 的响应式
  • 使用parted解决大于2T的磁盘分区
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 项目管理碎碎念系列之一:干系人管理
  • 用jQuery怎么做到前后端分离
  • 追踪解析 FutureTask 源码
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • #define与typedef区别
  • #前后端分离# 头条发布系统
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (排序详解之 堆排序)
  • (算法设计与分析)第一章算法概述-习题
  • ./和../以及/和~之间的区别
  • .chm格式文件如何阅读
  • .Net的DataSet直接与SQL2005交互
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • ??在JSP中,java和JavaScript如何交互?
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [LeetCode]-225. 用队列实现栈
  • [Linux]创建新用户并授予root权限