关于<aop:around>中的方法,需要第一个参数为ProceedJoinPoint,在方法体中通过该参数调用proceed()才能使目标方法得到调用。

当一个切面中有多个<aop:around>,而每个around的切点方法都有一个proceed(),目标方法还只是执行一次那么按照顺序调用:外里proceed()里外。

就好比从正面看一个人,首先看到他的第一件外套,在看到他的内衣,再是肉体,肉体就是目标方法,而从肉体出来,后面是内衣,再是外套。

使用ProceedJoinPoint参数的getArgs()可以得到目标方法的参数,如果目标方法有返回值,around的方法也应该有返回值,返回proceed()的结果。

around因为有ProceedJoinPoint类型的参数所以获取目标方法的参数比较方便,同样的因为getArgs()是JoinPoint接口中定义的,所以before,after之类的若想获得目标方法的参数这可以通过这种手段,但是还有另外一种方法:

1.在配置文件中,指明pointcut有一个表达式,例expression="execution(* com.*.*(..)) and args(x,y)",其中and args(x,y)就是目标参数的获取手段。

x,y必须和aop方法中的参数名称一样,原理是从目标方法中获取参数的值后传递给了args(x,y)中的x和y,再传递args传递给aop方法中的参数。但是因为args()中的参数是对应aop方法的参数的,而目标方法的参数是传递给args()的,也就是说这3方必须参数个数一致,不计算JoinPoint类型参数。别名也是对应aop方法参数,args()对应别名。

但是这个样子就导致了配置文件和java方法中的参数联系太过紧密,因此spring还提供了取别名的能力——arg-names,它是<aop:around/before/...>中的属性,值之间用","隔开,只要个数与aop方法参数个数一样就行了。虽然因为是按顺序和aop方法参数对应的,但如果第一个参数是JoinPoint,会忽视JoinPoint参数往后对应

取了别名之后,and args(xx)中的参数名称就是和别名一样了。

学习spring第6天(aop获取目标方法参数)的更多相关文章

  1. Spring Aop 修改目标方法参数和返回值

    一.新建注解 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Document ...

  2. Spring:使用Spring AOP时,如何获取目标方法上的注解

    当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等 自定义注解 package com.agent.annotation; import java.lang.annot ...

  3. AOP中ProceedingJoinPoint获取目标方法,参数,注解

    private void saveLog(ProceedingJoinPoint jp,long time)throws Throwable { package com.cy.pj.common.as ...

  4. Aop实现拦截方法参数

    对于spring框架来说,最重要的两大特性就是AOP 和IOC. 以前一直都知道有这两个东西,在平时做的项目中也常常会涉及到这两块,像spring的事务管理什么的,在看了些源码后,才知道原来事务管理也 ...

  5. Spring AOP获取拦截方法的参数名称跟参数值

    注意:这种方式需要JDK1.8版本支持 开始:http://www.cnblogs.com/wing7319/p/9592184.html 1.aop配置: <aop:aspectj-autop ...

  6. 为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】

    每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用.如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring ...

  7. 学习Spring框架等技术的方向、方法和动机

    学习Spring框架最早学习Spring框架是在大二的时候,当时看了几本书,看了一些视频,主要是传智播客的.更多的,还是写代码,单独写Spring的,也有与Struts和Hibernate等框架整合的 ...

  8. Spring框架Controller层(表现层)针对方法参数是Bean时HttpServletRequest绑定参数值问题解释

    在做项目的时候,有一个需求是将数据库中的信息封装到实体类返回到jsp界面 传过来的参数只是实体类的id属性,然后根据id属性去查数据库,事情就是这样,然后 结果遇到很奇怪的事情,在jsp页面中使用EL ...

  9. 学习Spring Boot:(十一) 自定义装配参数

    前言 SpringMVC 中 Controller 中方法的参数非常灵活,得益于它的强大自动装配,这次将根据上次遗留下的问题,将研究下装配参数. 正文 SpringMVC中使用了两个接口来处理参数: ...

随机推荐

  1. easyui 加载本地json 文件的方法

    easyui 加载本地json 文件的方法 2017年12月15日 17:18:07 vivian_hnd 阅读数 2155 https://blog.csdn.net/vivian_wang07/a ...

  2. 「SCOI2010」幸运数字

    传送门 Luogu 解题思路 首先构造出所有的幸运数字. 然后考虑一个幸运数字会产生多少贡献. 对于一个数 \(x\),它在区间 \([l,r]\) 内的倍数的个数为 \(\lfloor \frac{ ...

  3. String类与StringBuffer类

    String类与StringBuffer类   一.String类和StringBuffer类的区别 String类是不可变类,新建的对象为不可变对象(String类的内容和长度是固定的),一旦被创建 ...

  4. Eclipse 导入 Tomcat 源码

    我的环境:Win10,Eclipse 4.8.0 Photon,JDK 10.0.2   1.下载Tomcat源码 我下载的是:apache-tomcat-9.0.12-src.zip 下载地址:ht ...

  5. IntelliJ如何设置自动导包

    idea 关于自动导包的设置 标签: idea 2016-09-30 18:10 400人阅读 评论(0) 收藏 举报 本文章已收录于: .embody{ padding:10px 10px 10px ...

  6. JAVA实现单例模式的四种方法和一些特点

    JAVA实现单例模式的四种方法和一些特点,需要的朋友可以参考一下     一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Sing ...

  7. [AHK]输入法状态提示,中文状态提示“中”,英文状态提示“EN”[转]

    测试中发现使用小鹤双拼,如果不是使用shift切换中英文,效果不理想,留下此文章做个标记 https://www.autoahk.com/archives/8755 输入法状态提示,中文状态提示&qu ...

  8. Linux下四种安装软件方式

    1.yum源安装 可以解决依赖关系,但不确定安装的位置 2.rpm 基础安装 要自己解决依赖问题 rpm -ivh 安装 rpm -uvh 更新 rpm -e --nodeps 卸载    取消依赖 ...

  9. RocketMQ 单机部署(单master模式)

    一.为了快速了解rockmq,先搭建一个简单的单机版的rocketmq,前期准备:1.CentOS 7.6 64位(阿里云)(4G内存) 2.jdk1.8 3.maven 3.5.4 4.直接从官网上 ...

  10. SQL statement ignored

    存储过程语句错误,字段或变量名可能拼错,导致存储过程无法执行. 解决办法:仔细检查存储过程里的变量,字段,语句等是否正确.