在Spring AOP中,关于 [为通知传递参数] 的配置问题 5C

下面是aop:config的配置

 <aop:config>
        <aop:aspect ref="magician">
            <aop:pointcut id="thinking"
            expression="execution(* 
            com.springinaction.springidol.Volunteer.thinkOfSomething(String))
            and args(thoughts)" 
            />
            <aop:before method="interceptThoughts" 
            arg-names="thoughts" 
            pointcut-ref="thinking"/>
        </aop:aspect>
</aop:config>

下面是我的问题
1. 按照切点的表达式,我们可以知道thinkOfSomething(String)方法有一个String参数,那么在匹配切面中的方法的时候,根据配置可以知道方法名是interceptThoughts,那么再检查该方法是否有且只有一个String参数不就行了,为什么还要在切点中配置"args(thoughts)",在通知方法配置属性arg-names="thoughts",而且要求字符串“thoughts”是一致的,而不是作为一个占位。
2. 假设配置args(thoughts)只是为了说明该切点需要传递参数和传递参数的个数(比如说thoughts只是占位,表明传递第一个参数),那么根据参数的个数和对应的类型就可以匹配到通知方法了。那么,arg-names="thoughts" 就是多余的了。

上面就是我的疑问,有一种情况是我试验可以成功的,那就是切点不配置args(thoughts),通知方法不配置arg-names="thoughts",并且通知方法interceptThoughts是个无参函数,这个情况是可以的。

总而言之,关于通知方法的匹配逻辑我很模糊,希望大神指点。

2

1个回答

我试了一下
如果不改配置,那么interceptThoughts方法中的参数值等于thinkOfSomething方法中的参数值。
如果把expression="execution(*com.springinaction.springidol.Volunteer.thinkOfSomething(String)) and args(thoughts)" 中的and args后面的内容去掉,就会抛出异常java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut,原因也许是通知方法interceptThoughts,中的参数匹配不到了,spring弄不清楚到底该给参数赋啥值。
如果切点配置args(thoughts),但是通知方法interceptThoughts中的参数换成int类型,那么通知方法就不执行了。
arg-names="thoughts"有没有不影响程序运行。
也许结论就是args提供了一种方式用来访问切点中的参数并传递给通知方法?

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Spring AOP 实现
基于Spring 注解的AOP实现,包括为aop通知传递参数
spring aop五种通知及通知中传递参数!
定义切面(包含五种通知): import org.aspectj.lang.ProceedingJoinPoint; public class MyXmlServiceAop { public void beforeHandler(String name, int age) { System.out.println("前置通知:" + name + ":age=" +
SpringAOP处理通知中的参数
Spring借助AspectJ的切点表达式语言来定义Spring切面在spring中尝试使用其他指示器时,会抛出IllegalArgument-Exception异常。如上的这些指示器,只有exception指示器是实际执行匹配的,而其他都是用来限制匹配的。切面表达式分析带参数的切点表达式分解在该切点表达式中使用了args(trackNumber)限定符。表示传递给playTrack()方法的int
SpringAOP 处理通知中的参数(注解与xml配置)
上一篇文章讲的是springaop的最基本配置,没有任何参数,有参数的也就在环绕通知@Around 中使用了ProceedingJoinPoint 作为参数,要是切面所通知的方法确实有参数该怎么办?下面通过一个需求来实现aop处理参数的功能。 一个马戏团里有很多演员,编号分别为A、B、C…,老板要记录每个演员的演出次数作为年底发红包的依据。
Spring AOP切点和通知
前言 Spring切面由切点和通知组成。Spring AOP是基于代理的,包括JDK动态代理或者CGLIB动态代理,只支持方法级别的连接点,因此Spring AspectJ风格切点表达式仅仅是AspectJ的子集。表达式之间可以用&&、||、!表示与或非、如果是在XML中配置,那么需要用and、or、not代替&&、||、!。注意,切点的定义如果只到子类,那么父类的方法无法被拦截。
Spring 配置使用 - AOP 通知参数
基本概念若想要在通知方法获取被通知方法的参数共有两种方式:自动获取、手动指定。下面来探究下这两种方式的不同之处。自动获取参数在介绍 AOP 的通知类型时有提到过环绕通知,该通知类型可以通过参数 ProceedingJoinPoint 自动获取被通知方法的参数值并调用该方法。除了 ProceedingJoinPoint 外,还有 JoinPoint,JoinPoint.StaticPart 也都能自动
spring切面使用传递给被通知方法的参数
spring切面使用传递给被通知方法的参数
SpringAOP--使用通知获取目标方法的参数
获取目标方法的信息    访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点。JoinPoint里包含了如下几个常用的方法:Object[] getArgs:返回目标方法的参数Signature getSignature:返回目标方法的签名Object getTarget:返回被织入...
SpringAOP环绕通知的使用
上一篇文章介绍了SpringAOP的概念以及简单使用:SpringAOP概念及其使用在springAOP中有五种通知,环绕通知是最为强大的通知。它能够让你编写的逻辑将被通知的目标方法完全包装起来。实际上就像在一个通知方法中同时编写前置通知和后置通知。 本片文章具体讲解环绕通知的使用。使用注解使用环绕通知定义切面:@Aspect public class AudienceAround {
spring中AOP中标签加载通知
spring中AOP中标签加载通知,spring中AOP中标签加载通知spring中AOP中标签加载通知spring中AOP中标签加载通知,spring中AOP中标签加载通知
Spring AOP(六)通知获取参数
通知获取参数 在之前AOP的文章中,大部分我们没有给通知传递参数。有时候我们希望能够传递参数给通知。我们只需要子啊切点处加入对应的正则式就可以了。 当然,对于非环绕通知我们还可以使用一个连接点(Pointcut)类型的参数,通过它也可以获取参数。 前置通知中获取参数 切面类MyAspect package com.lay.springboot_aop.aspect; import org.asp...
Spring AOP:原理、 通知、连接点、切点、切面、表达式
0:Spring AOP 原理 简单说说 AOP 的设计: 每个 Bean 都会被 JDK 或者 Cglib 代理。取决于是否有接口。 每个 Bean 会有多个“方法拦截器”。注意:拦截器分为两层,外层由 Spring 内核控制流程,内层拦截器是用户设置,也就是 AOP。 当代理方法被调用时,先经过外层拦截器,外层拦截器根据方法的各种信息判断该方法应该执行哪些“内层拦截...
spring aop事务通知(切面异常处理)
Spring Aop切面异常日志记录,本教程使用spring aop来记录service层所报出的异常记录,这样就可以很容易的知道我们项目的异常出现在哪个service方法中了,下面是spring aop异常切面的使用方法。 第一步:在我们的spring-context.xml中配置Aspectj自动代理,用于扫描我们自定义的异常处理切面类,代码如下。 第二步:自定义我们spring aop异
Spring AOP中的增强器&切点&通知
类图 增强器 切点 通知 在增强其中定义了切点Pointcut,通知父类Advice 编程方式定义AOP
Spring AOP的五大通知及作用详解
这是我在博客中找到的一篇解释得非常全面的文章。 在这篇博客中我们就用配置文件的方式来来介绍AOP中的五大通知(也可以用注解)。 前置通知(before):在目标方法执行之前执行 后置通知(after):在目标方执行完成后执行,如果目标方法异常,则后置通知不再执行 异常通知(After-throwing):目标方法抛出异常的时候执行 最终通知(finally);不管目标方法是否有异常都会执行,相当于...
AOP后置通知获取目标方法的参数以及配置详解
AOP后置通知获取目标方法的参数以及配置详解
Spring 通过XML配置文件以及通过注解形式来AOP 来实现前置,环绕,异常通知,返回后通知,后通知
本节主要内容:   一、Spring 通过XML配置文件形式来AOP 来实现前置,环绕,异常通知     1. Spring AOP  前置通知 XML配置使用案例     2. Spring AOP  环绕通知 XML配置使用案例     3. Spring AOP  抛出异常后通知 XML配置使用案例     4. Spring AOP  返回后通知 XML配置使用案例     ...
Spring - AspectJ 注解实现AOP的五种通知
【1】AOP通知方法 通知方法可以简单理解为标注有某种注解的简单的 Java 方法,在目标方法执行时的某个位置(时机)进行执行。 AspectJ 支持 5 种类型的通知注解: @Before: 前置通知, 在方法执行之前执行 @After: 后置通知, 在方法执行之后执行 @AfterRunning:返回通知, 在方法返回结果之后执行 @AfterThrowing: 异常通知...
Spring AOP中的前置通知和后置通知详解
不同版本的spring对AOP的支持有所不同,spring2.0之前,它主要针对不同类型的拦截器使用XML配置文件通过代理来实现。而spring2.0之后,它可以使用JDK5的注解来完成AOP的实现,只是几个简单标签就可以完成,使得开发更加简单,便捷。所以推荐使用后一种方法。但是很多旧的项目中使用了前一种实现方法,所以我们也应该对第一种方法有所掌握。 首先通过代码介绍spring2.0之
Spring Aop(五)——给Advice传递参数
5 给Advice传递参数Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入点方法执行有关的对象,比如切入点方法参数、切入点目标对象(target)、切入点代理对象(this)等。5.1 获取切入点方法参数假设我们现在有一个id为userService的bean中定义了一个fi
spring aop的五种通知类型
spring aop通知(advice)分成五类: 前置通知、正常返回通知、异常返回通知、返回通知、环绕通知
Spring AOP 环绕通知
Spring AOP的环绕通知和前置、后置通知有着很大的区别,主要有两个重要的区别: 1)目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知是不能决定的,它们只是在方法的调用前后执行通知而已,即目标方法肯定是要执行的。joinPoint.proceed()就是执行目标方法的代码。 2)环绕通知可以控制返回对象,即可以返回一个与目标对象完全不同的返回值。虽然这很危险,但
Spring中Aop的使用
Spring中Aop的使用!~ 关于前置通知,后置通知,环绕通知,异常通知的使用!~ 简单的demo!~
AOP 环绕通知
package com.gqc.aop03; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; //环绕通知可以修改目标方法的返回结果 public class MyMethodInterceptor implements MethodIn
spring aop的注解配置中,前置,后置,环绕通知,以及异常通知怎么获得被代理方法的参数...
定义的接口 package com.aspectaop; public interface IUserDao {  /* (non-Javadoc)  * @see com.aspectaop.IUserDao#save()  */ /* (non-Javadoc)  * @see com.aspectaop.IUserDao#save(java.lang.String)  */ publi...
spring知识六------AOP五大通知
AOP通知 重用切面 切入点表达式 切面优先级 xml配置通知
Spring -- AOP入门基础&基于Aspect的AOP通知用法
动态代理我们在日常开发过程中是否会遇到下图中的这种状况 红框中的是我们要输出的日志,你是否发现,日志中大部分信息都是相同的,并且如果我们要修改一个地方,所有的地方都需要改,而且代码看起来还比较冗余下面我们就可以通过动态代理的方式解决这个问题 看下代码public interface Calculation { public int add(int x, int y); publi
Spring AOP返回通知&异常通知&环绕通知(二十二)
一、返回通知 无论连接点是正常返回还是抛出异常, 后置通知都会执行. 如果只想在连接点返回的时候记录日志, 应使用返回通知代替后置通知. 在方法法正常结束受执行的代码; 返回通知是可以访问到方法的返回值的! 在返回通知中, 只要将 returning 属性添加到 @AfterReturning 注解中, 就可以访问连接点的返回值. 该属性的值即为用来传入返回值...
Spring中AOP注解的使用说明及通知的执行顺序问题
步骤: 1.环境搭建:项目结构 com                                                 |_ xiaozhang                                                         |_ service                                                     ...
spring aop 环绕通知around和其他通知的区别
前言:      spring 的环绕通知和前置通知,后置通知有着很大的区别,主要有两个重要的区别: 1) 目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知   是不能决定的,他们只是在方法的调用前后执行通知而已,即目标方法肯定是要执行的。 2)  环绕通知可以控制返回对象,即你可以返回一个与目标对象完全不同的返回值,虽然这很危险,但是你却可以办到。而
spring(十):aop环绕通知
假如有这么一个场景,需要统计某个方法执行的时间,如何做呢?   典型的会想到在方法执行前记录时间,方法执行后再次记录,得出运行的时间。   如果采用Spring的AOP,仅仅使用前置和后置方法是无法做到的,因为他们无法共享变量。这样通过环绕通知,就可以快捷的实现。   首先在切面通知类中声明环绕通知类: public void watchPerform
Spring---AOP基本概念以及Advice5种类型的通知注解应用实例
AOPAOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对
springAOP中的各种通知
在上一篇博客中我们介绍了AOP的一些基本概念,并且在博客中的Demo我们没有使用配置文件的形式来实现,在博客的结尾我们我们也抛出了那样写的问题,在这篇博客中我们就用配置文件的方式来来介绍AOP中的五大通知。 前置通知(before):在目标方法执行之前执行 后置通知(after):在目标方执行完成后执行,如果目标方法异常,则后置通知不再执行 异常通知(After-throwing):目标方法抛出异常的时候执行 最终通知(finally);不管目标方法是否有异常都会执行,相当于try。。catch
Spring框架中AOP原理及通知类型
这篇文章讲述的是Spring框架中的AOP原理以及相关的一些例子,如有错误或不当之处还望各位大神批评指正 什么是AOP? 基本概念 AOP是一种编程思想,即面向切面编程,是对传统的面向对象编程思想(OOP)的补充 AOP术语 切面Aspect:一个模块具有一组提供横切需求的 APIs 通知Advice:这是实际行动之前或之后执行的方法 目标对象Target object:被通知...
Spring AOP配置测试异常通知运行
我想要测试自己的异常通知是否能够正常运行的方法(也可以说异常运行的过程) 1:首先是xml配置 &amp;lt;bean id=&quot;accountService&quot; class=&quot;com.itheima.Service.Impl.AccountServiceImpl&quot;&amp;gt;&amp;lt;/bean&amp;gt; &amp;lt;!--配置logger类 --&amp;gt; &amp;lt;bean id=&quot;Logger&quot; class=
Spring AOP实例(五大通知类型)
对于AOP的讲解,请参考http://blog.csdn.net/liujiahan629629/article/details/18864211 下面给出一个例子给大家参考 定义接口public interface DempartmentService { public void addDempart(String depa); }4.实现接口 public class Departmen
关于对Spring中AOP的Advice(通知、增强)的属性Around的理解
误解: 一开始我看教程上讲的说 Around 是环绕的意思即:在被增强的方法调用前后都会去执行增强的逻辑代码。也就是以为增强的逻辑代码会被调用2词 经过实验发现并非如此 正解:这里的环绕Around说的方法前后都会被执行应该被如下理解 在增强的逻辑代码 任意位置都可以 选择调用执行被增强的方法,然后被增强的方法被调用之后会去执行  增强的逻辑代码 接下来剩余的代码部分。 例如下图
AOP的通知类型(注解)
注解 配置 spring AOP 实现五种通知类型 话就不多说了,首先准备环境,准备环境部分就直接看xml配置spring AOP吧。也可以直接把这篇的源码给download下来 环境使用maven搭建spring 环境,引入必要的jar包之后,我把之前的xml配置先给注释掉。 要使用注解配置切面,首先要在spring 的配置文件开启 切面自动代理 &amp;amp;lt;aop:aspectj-au...
Spring4笔记----AOP的返回通知和异常通知
返回通知: 无论连接点正常返回还是抛出异常,后置通知都会执行。如果只想在连接点返回的时候记录日志,应使用返回通知代替后置通知。 在返回通知中,只需要在@AfterReturning注解中添加returning属性,就可以访问连接点的返回值。 必须在通知方法的签名中添加一个同名参数,在运行时Spring AOP会通过这个参数传递给返回值。 在方法法正常结束后执行的代码  返回通知是可以
Spring学习(十)-AOP返回通知&异常通知&环形通知
1.LoggingAspect.java切面类环形通知包括所有前置 后置 返回 异常package com.spring.aop.impl2;import java.util.Arrays;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于大数据培训 数据库中关于课程的表