通知方法参数注入:

在Spring AOP中,除了execution和bean指示符不能传递参数给通知方法,其他指示符都可以将匹配的相应参数或对象自动传递给通知方法。

1、获取匹配的参数

通过"argNames"属性指定参数名。

@Before(value="args(param)", argNames="param") //明确指定了
public void beforeTest(String param) {  System.out.println("param:" + param);
}

args、argNames的参数名与beforeTest()方法中参数名 保持一致,即param

使用args指示符,可以不利用argNames声明参数

@Before("execution(public * com.learn..*.show(..)) && args(userId,..)")public void beforeTest(int userId) {System.out.println("userId:" + userId);}

args的参数名与beforeTest()方法中参数名 保持一致,即param

2、获取匹配的对象

例:

@Pointcut(value="@annotation(t)",argNames = "t")public void annotationTest(Table t){}//引用时带上类名@After(value = "annotationTest(t)")public void after(Table t){System.out.println("调用LearnAspect的切入点pointcut()");}

Table是一个自定义注解。要获取该对象,annotationTest方法要先在方法中定义添加该参数,再利用argNames声明,切入点表达式也要改为参数名。即t

JoinPoint获取参数:

Spring AOP提供使用org.aspectj.lang.JoinPoint类型获取连接点数据,任何通知方法的第一个参数都可以是JoinPoint(环绕通知是ProceedingJoinPoint,JoinPoint子类)。

(1)JoinPoint:提供访问当前被通知方法的目标对象、代理对象、方法参数等数据

(2)ProceedingJoinPoint:只用于环绕通知,使用proceed()方法来执行目标方法

如参数类型是JoinPoint、ProceedingJoinPoint类型,可以从“argNames”属性省略掉该参数名(可选,写上也对),这些类型对象会自动传入的,但必须作为第一个参数。

例:

切面:

@Pointcut(value="args(p)")public void argsTest(int p){}@Before(value="argsTest(p)",argNames="p")public void afterTest(JoinPoint jp,int p){Object[] o = jp.getArgs();System.out.println(o[0]);System.out.println(p);System.out.println("args");}

结果:

1  //利用JoinPoint获取参数
1  //利用参数注入获取参数
args
This is showTime

AfterReturning 获取请求返回值:

@Pointcut("execution(public * com.learn.spring..*.*(*))")public void pointcut() {}/**配置后置通知返回,使用在方法pointcut()上注册的切入点 */@AfterReturning(pointcut="pointcut()", returning="returnValue")public void afterReturn(Object returnValue){System.out.println("afterReturn  "+returnValue);}

注意:

1、returning参数名与afterReturn()方法参数名相同,即都为returnedValue.

2、AfterRetruning含有返回值时,不能和Around指示符使用同一个pointcut。返回值会为null,报错:

org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: ....

AfterThrowing 获取请求抛出异常:

@Pointcut("execution(public * com.learn.spring..*.*(*))")public void pointcut() {}/** 配置抛出异常后通知,使用在方法pointcut()上注册的切入点*/@AfterThrowing(pointcut="pointcut()",throwing="ex")public void afterThrow(Exception ex){System.out.println("afterThrow "+ex.getMessage());}

throwing参数名与afterThrow()方法参数名相同,即ex


Spring AOP切面实现:参数传递相关推荐

  1. Spring AOP切面的时候参数的传递

    Spring AOP切面的时候参数的传递 Xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...

  2. spring aop 切面添加日志

    这是一个非常简单的spring aop切面添加日志的程序,下面来看一下这个程序 1.程序使用jar包 2.切面类LoggingAspect.java package com.cailei.aop.as ...

  3. Spring AOP 切面@Around注解的具体使用

    @Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务. 比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@ ...

  4. 【经典】Spring aop切面实现异步添加日志—完整版

    系统开发中我们常遇到要处理系统日志等信息的,在此我分享一篇 利用spring aop切面来异步添加日志的操作,其中用到了 队列和多线程,前面的博客有写. 第一步:创建log实体,根据自己业务而定, p ...

  5. spring AOP切面日志

    spring AOP切面日志 导入依赖 <properties><fastjson.version>1.2.49</fastjson.version> </p ...

  6. Spring AOP切面使用详细解析

    相关文章: SpringBoot AOP切面的使用 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析) 架构师系列内容:架构师学习笔记(持续更新)) Spring AOP 应 ...

  7. 日志管理(spring AOP切面拦截)

    **最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...

  8. Spring AOP 切面(Aspect)应用详解

    1. AOP 切面应用 下面是一个AOP切面的一个简单的应用实例 引入AOP依赖 <dependency><groupId>org.springframework.boot&l ...

  9. Spring aop切面插入事物回滚

    <!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...

  10. Spring AOP切面

    在软件开发中,分布于应用多出的功能被称为和横切关注点. 通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离正是面向切面编成( ...

最新文章

  1. php mms,PHP代码示例_PHP账号余额查询接口 | 微米-中国领先的短信彩信接口平台服务商...
  2. java使用线程求素数和1000个0~0.9随机数_求素数(多线程练习题)
  3. 兼顾效率与安全:如何制止新模版注入漏洞?
  4. PMCAFF问答精选 | 对于用户反馈,产品经理需要第一时间给出回应吗?
  5. vim+python3的字符串却不能使用中文
  6. 垃圾收集 java_关于Java垃圾收集
  7. 【CodeForces - 255B】Code Parsing(思维,字符串)
  8. 论发SCI论文和生孩子的共同点:那我这篇怀的也太久了!
  9. 1.软件工程--软件建模与文档协作 --- 软件开发过程
  10. ie6下,给a添加事件,如果事件中有http请求,将会无效
  11. 疫情核酸检测,应考虑使用刷身份证的方式
  12. 一文搞定权限设计模型(RBAC,ABAC)超详细图文解析
  13. 打字速度测试php源码,打字练习-打字速度测试-在线工具
  14. Vscode文件夹和代码各种颜色(详细汇总)
  15. 弘辽科技:淘宝标签商家是什么意思?注意哪些事项?
  16. 计算机复制方法有,电脑复制粘贴怎么用(6种电脑复制粘贴方法)
  17. 唯一身份访问者(独立访客)与访问次数的区别
  18. 苹果系统怎样修改mac地址?
  19. 人工智能会破灭嘛?听听福布斯邀请的这50位大拿怎么说
  20. Android——adapter解读

热门文章

  1. Java面试单点登录_单点登录面试题
  2. python itchat_Python itchat模块在微信上的
  3. python3爬虫爬取网页图片简单示例
  4. MySQL数据库主从双向同步
  5. 鸟哥linux命令小结
  6. 思考模式之“5W1H“
  7. 电脑和开发板如何串口连接
  8. linux 消息队列查看和删除
  9. 秒杀系统设计思路笔记
  10. 海贼C语言,PSV海贼无双3金手指代码 (PSVC)