在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是个无参函数,这个情况是可以的。

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

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提供了一种方式用来访问切点中的参数并传递给通知方法?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
spring aop五种通知及通知中传递参数!
定义切面(包含五种通知): import org.aspectj.lang.ProceedingJoinPoint; public class MyXmlServiceAop { public void beforeHandler(String name, int age) { System.out.println("前置通知:" + name + ":age=" +
spring AOP中如何给通知传递参数
我想在不修改原对象代码的情况下,插入对域模型的数据搜集方法,需要传入1个参数。 rn例如:病人信息(PatientInfo)与病人信息操作日志(PatientInfoOperationLog),二者存在一对多的关系。 rnORM映射配置中采用了级联,病人信息操作日志为被动插入操作。 rn在CreatePatientAction中采集病人信息的数据,并对病人信息执行显式的save。 rn这样看来,病人信息操作日志的信息与Action并没有什么关联,可以视为独立运作单元;而且,如果以后不打算采用这个日志的时候,可以修改配置直接修改或删除AOP和ORM映射配置就可以了。 rn前段时间考虑过spring是否可以注入方法,经过讨论发现是不可行的。这样我打算使用AOP,但我尝试了AOP配置,在没有传递参数的情况下,可以正常执行通知。但我需要配置2个对象之间的关系,不得不传入病人信息作为参数来完成任务,但不知道怎么配置这个参数。 rnrn我尝试过加入arg-names属性,但服务器启动时就报错,没加这个属性也会报错,因为通知调用的方法是有参数的。 rnrn而且还有个疑问,这个参数是否可以是一个已经实例化的引用?我需要的是这个引用,而不能是新创建的对象,因为这没有意义。 rnrn我的配置如下,这里是没有加arg-names属性: rn rn rn rn rn rn rn rnrnPatientInfoOpeLogPlugin类代码如下: rnrnpublic void plugin(PatientInfo patientInfo) rnrnlog.setOperation(defaultOperation); rnlog.setOperateTime(this.now()); rnlog.setOperator("admin"); rnlog.setPatientInfo(patientInfo); rnSet logSet= new HashSet (); rnlogSet.add(log); rnpatientInfo.setOperationLog(logSet); rnrn rnrn服务器启动错误概要信息如下: rn有没有配置arg-names的情况都一样: rn…… Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut rn…… rnrnrnn[b]问题补充:[/b]n请一楼给个例子我试试,谢谢!n[b]问题补充:[/b]n[size=small][color=blue]三楼whistler的例子是标准例子。看后我考虑了一下,如果对Service类的相关方法进行拦截,确实可以达到我想要的结果,而且还可以不受Struts2的自带拦截器影响。其实,我原来的想法集中在如何让AOP拦截Action了,但后来经过查询资料和测试,发现无法达到,因为Struts2本身也对Action做了处理,与AOP的拦截发生了冲突。如果不拦截Action,就没有这个问题了。rn谢谢你、谢谢大家的回复![/color][/size]
Spring AOP中的 ‘通知’
来张图简单理解一下代理 一个环绕通知,jdk里的 Spring支持六中通知 Spring中的通知类型 通知名称 接口 描述 前置通知 org.springframework.aop. MethodBeforeAdvice 通过前置通知,可以在连接点执行之前做自定义处理。虽然可以完全访问调用的目标和方法参数,但控制不了方法的执行...
关于spring aop切入点配置问题。
rn 我在的代码是这样的。rnrn  其中rnrn  这一块的代码因为只配置了一个切入点。而实际情况是action的目录参差不齐。我想配置多个切入点怎么办。rn
关于spring的aop:config配置问题
例子配置文件rn[code=text]rnrn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rnrnrn rn rn rn rn[/code]rn在上面的例子中,这个事务切面指的是对com.cbgmcs.service类中的被txAdvice中声明的方法做拦截约束吗?rn如果是这样的话,service层不是应该是实现业务逻辑的吗?上面那个get, find, insert等方法不都是dao层的方法来的吗?应该不可能在service实现上面的方法吧。rn我看网上很多例子都是约束在service层的,难道service层是实现数据库增删查改的?rn根据我的理解,假设这个是一个userService的话,里面的方法应该是login()之类的吧,而不get, find, insert等方法吧。rn求指导。
spring aop 使用通知
 &amp;lt;!--ADVICE--&amp;gt;    &amp;lt;bean id=&quot;theAroundAdvice&quot; class=&quot;AroundAdvice&quot;/&amp;gt; 他的主要工作流程是:首先通过一个代理,代理里面包含的参数有: 1.首先指出代理的接口       &amp;lt;property name=&quot;proxyInterfaces&quot;&amp;gt;          &amp;lt;value&amp;g
Spring AOP的五种通知
package cn.sdut.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; i...
spring Aop——前置通知
一:AspectJ 1.AspectJ:java社区里最完整最流行的AOP框架。 2.在spring2.0以上版本中,可以使用基于AspectJ注解或基于XML配置的AOP。 二:在spring中启用AspectJ注解支持 1.要在spring应用中使用AspectJ注解,必需在classpath下包含AspectJ类 com.springsource.org.aopalliance-1...
第十章 Spring AOP之通知
NULL 博文链接:https://1151461406.iteye.com/blog/2390238
Spring AOP 各种通知
sping aop 各种通知
Spring AOP 环绕通知
Spring AOP的环绕通知和前置、后置通知有着很大的区别,主要有两个重要的区别: 1)目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知是不能决定的,它们只是在方法的调用前后执行通知而已,即目标方法肯定是要执行的。joinPoint.proceed()就是执行目标方法的代码。 2)环绕通知可以控制返回对象,即可以返回一个与目标对象完全不同的返回值。虽然这很危险,但
Spring之AOP通知(Return&Throwing;)
本教程从基础的三大框架开始介绍,到进行整合,同时加入了FreeMarker模板和Spring OSGI的说明及应用。后以Maven项目进行整理,让学员能够将知识融会贯通,活学活用,把技术知识运用到实际的项目中来。其中分布介绍了,各个框架的基本独立使用,以及后续Maven的安装和应用,包括私服Nexus的搭建解决网络问题。项目中对EasyUI的通用及独特之处均有相应的模板。
Spring AOP——后置通知
一:后置通知 1.后置通知是在连接点完成之后执行的,即连接点返回结果或者抛出异常的时候,下面的后置通知记录了方法的终止 2.一个切面可以包括一个或者多个通知 二:代码实现 1.后置通知方法 package com.dhx.spring.aop.impl; import java.util.Arrays; import java.util.List; import org.aspec...
spring aop 环绕通知
spring aop
Spring AOP之通知类别
什么是通知类别 通知在切入点中执行的位置就是通知类别。关于通知和通知类别具体概念请移步我的另一篇博客Spring AOP之HelloWorld与概念介绍 5种通知类别介绍 在Spring AOP 中通知类别有5种分别是: before 前置通知 after 后置通知 afterReturning 返回后通知 afterThrowing 抛出异常后通知 around 环绕通知 通知类别演示公共代...
Spring AOP传递参数
如果在我切点方法中出现了异常,我需要将我的资源进行状态的修改。它不在方法的参数中,也不在返回值中。rnrn比如:方法接收前台的参数创建一个APP,方法是异步的,我创建的过程中出现异常,怎么把这App实例及其他的资源传给AOP的异常通知方法进行状态的修改及回滚资源呢rnrn目前:我想到是使用异常类进行参数的携带,请问还有更好的方法吗?
(12)Spring AOP通知
aspect定义切面,切面里面可以有多个通知,这些通知大概就是在被拦截的方法前,方法中,方法后执行,通知大概有这几种类型 修改被拦截类的接口 package shuai.spring.study.service; public interface IHelloService { public void sayHello(); public void sayHello(String
spring aop 创建通知
      package com.notice; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice;import org.springframework.aop.MethodBeforeAdvice;import org.springframework.aop.Thr...
Spring AOP切点和通知
前言 Spring切面由切点和通知组成。Spring AOP是基于代理的,包括JDK动态代理或者CGLIB动态代理,只支持方法级别的连接点,因此Spring AspectJ风格切点表达式仅仅是AspectJ的子集。表达式之间可以用&&、||、!表示与或非、如果是在XML中配置,那么需要用and、or、not代替&&、||、!。注意,切点的定义如果只到子类,那么父类的方法无法被拦截。
Spring -aop通知实例
Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点。简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。
Spring之Aop通知
在Spring的面向切面(AOP)中有五大通知(advice),分别为前置通知,后置通知,环绕通知以及异常通知: 前置通知:在目标方法前执行的通知,实现MenthodBeforeAdvice接口 后置通知:在目标方法执行之后,无论是否发生异常,都进行执行的通知,实现AfterReturningAdvice接口 异常通知:在目标方法出现异常时才会进行执行的代码,实现ThrowsAdvice...
Spring AOP切面传递参数
spring 配置文件相关配置 aop:config>           aop:aspect ref="magician">                     aop:pointcut expression="execution(* com.spring.aop.Thinker.thinkOfSomething(String)) and args
Spring AOP传递参数的问题
我的通知中需要用到被通知对象的参数,如何传递这个参数呢?我使用arg-names传递参数但是报错了。rn代码如下rn这是被通知对象rnpublic boolean SaveNewBlog(int Id, Blog blog) rn boolean b = false;rn try rn java.util.Date date = new java.util.Date();rn blog.setUserId(Id);rn blog.setBlogDay(new java.sql.Date(date.getTime()));rn blog.setBlogTime(new java.sql.Time(date.getTime()));rn template.save(blog);rn b = true;rn catch (Exception e) rn e.printStackTrace();rn b = false;rn finally rn return b;rn rn rn这是通知rnpublic void AfterSaveBlog(int Id) throws Throwable rn java.util.Date d = new java.util.Date();rn UserAction ua=new UserAction();rn ua.setUsersId(Id);rn ua.setActionType("blog");rn ua.setActionDay(new java.sql.Date(d.getTime()));rn ua.setActionTime(new java.sql.Time(d.getTime()));rn template.save(ua);rn rnrn我的applicationContext.xml中关于切面的配置如下rn rn rn rn rn rn rn rnrn测试方法如下:rnpublic void testSaveNewBlog() rn BlogDao blogdao=new BlogDaoImpl();rn Blog blog = new Blog();rn java.util.Date d = new java.util.Date();rn blog.setUserId(1);rn blog.setBlogTitle("111");rn blog.setBlogText("222");rn blog.setBlogDay(new java.sql.Date(d.getTime()));rn blog.setBlogTime(new java.sql.Time(d.getTime()));rn blogdao.SaveNewBlog(1, blog);rn rn
Spring AOP的配置问题
好长时间不维护自己的博客了,好象没有维护自己博客的习惯,只要将东西记到电子日记本上就完了。将东西放到网上晒一晒更好。 今天公司的网断了,然后发现Tomcat启动时竞然报错,报错的信息为 cvc-elt.1: Cannot find the declaration of element 'beans' 查了好长时间,最后定位是AOP的配置文件引起的。 配置文件的开头是 &amp;lt;beans ...
spring aop拦截器配置问题
到今天已经使用Mybatis完成了公司交给的demo程序的增删改查,以后有时间把自己的代码结果发上来供大家拍砖,这次要说的是,需求中需要在每个方法执行的时候打印一下系统执行的时间,我使用类似事务管理的aop方式在xml中配置如下。 [code=&quot;java&quot;] ...
spring的AOP配置问题
报的是404错误rn[code=XML]rnrnrnrn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rnrn rn rn rn rn rn rn rn rnrn[/code]rn上面是Spring的配置文件rn如果不加上AOP的那段代码就不会出问题,代码如下:rn[code=XML]rn rn rn rn rn rn rn rn[/code]rn会的帮忙解决一下,谢谢了!rn
spring AOP配置问题
用的spring2.0.8的版本,使用一下配置老报错: rn rn rnrn rn rn rn rnrn rn rnrn使用一下的配置就不会报错,同时我使用的是java5却不能实现注解式AOP,myeclispe 是6.5的,tomcat是6.0的,哪位高手能解释一下两种配置的区别吗?rn rn rncom.shop.spring.aop.Bean rn rn rn rn rn rn rntheAdvisor rn rn rn rn rn rn就不会报错,同时我使用的是java5却不能实现注解式AOP,myeclispe 是6.5的,tomcat是6.0的,哪位高手能详细解释一下两种配置的区别吗? rn rn rn rn rncom\.shop.\spring.\aop.\Bean.\theMethod rn rn rn
spring aop 事务配置问题
前人写的spring事务配置文件。有点看不明白啊。rnexpression="execution(* com.company..*.facade.*.*(..))" rn这个到底是在哪一层做了事务控制呢?rn我们系统有四层rnaciton-facade-service-daornrn是说只在facade层做了事务。还是说facade service dao层都做了
spring中AOP中标签加载通知
spring中AOP中标签加载通知,spring中AOP中标签加载通知spring中AOP中标签加载通知spring中AOP中标签加载通知,spring中AOP中标签加载通知
Spring AOP(三) AOP通知和切面类型
Spring AOP增强类型: Spring 按照通知Advice在目标类方法的连接点位置,可以分为5类: 前置通知(org.springframework.aop.MethodBeforeAdvice):在目标方法执行前实施增强 后置通知(org.springframework.aop.MethodAfterAdvice):在目标方法执行后实施增强 环绕通知(org.applliance.in...
Spring Aop原理分析(二) - Aop的拦截器和通知
Spring Aop原理分析(二) - Aop的拦截器和通知
关于spring中aop为何意
最近几个项目中一直在使用ssh框架,不过说实话.到现在还不明白其中的AOP为何意,网上查阅的资料看过一些感觉还不是不很清楚,其中aop是一种业务组件还是一种编程思想?rn还有spring.xml中为何要配置aop一些相关信息?
Spring之AOP注解之引入通知
  引入通知是一种特殊的通知类型。它通过为接口提供实现类,允许对象动态地实现接口,就像对象已经在运行时扩展了实现类一样。     引入通知可以使用两个实现类 MaxCalculator 和 MinCalculator, 让 PureCalculator动态地实现 IMaxCalculator 和 IMinCalculator 接口。 而这与从 MaxCalculator 和 MinCal...
《Spring AOP》-----各种通知解析
前言 上一篇文章中,小编简单介绍了SpringAop中的一些概念,意义、还有简单入门的小例子,那么现在小编带着读者解析一下SpringAop中的几种通知,所谓的通知,就是切面中的几种方法。 1、前置通知(切面类方法) /* * 在目标方法执行之前执行 * 参数:连接点 */ public void be
Spring AOP(六)通知获取参数
通知获取参数 在之前AOP的文章中,大部分我们没有给通知传递参数。有时候我们希望能够传递参数给通知。我们只需要子啊切点处加入对应的正则式就可以了。 当然,对于非环绕通知我们还可以使用一个连接点(Pointcut)类型的参数,通过它也可以获取参数。 前置通知中获取参数 切面类MyAspect package com.lay.springboot_aop.aspect; import org.asp...
Spring AOP 五种通知类型
1.before:前置通知,在一个方法执行前被调用。 2.after: 在方法执行之后调用的通知,无论方法执行是否成功。 3.after-returning: 仅当方法成功完成后执行的通知。 4.after-throwing: 在方法抛出异常退出时执行的通知。 5.around: 在方法执行之前和之后调用的通知。
Spring 配置使用 - AOP 通知类型
基本概念AOP,即 Aspect-Oriented Programming(面向切面编程),它其实是 OOP(Object-Oriented Programing,面向对象编程)思想的补充和完善。在使用 Spring AOP 之前,首先需要掌握以下几个常用术语:1.aspectaspect,即切面。切面是通知和切点的结合。通知和切点共同定义了关于切面的全部内容。2.adviceadvice,即通知。
spring的aop的前置和后置通知
<p>n  <span style="color:#333333;font-size:14px;background-color:#FFFFFF;">Spring是一个开源框架,它由</span><a href="https://baike.baidu.com/item/Rod%20Johnson">Rod Johnson</a><span style="color:#333333;font-size:14px;background-color:#FFFFFF;">创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。 <span style="color:#333333;font-size:14px;background-color:#FFFFFF;">Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。本视频详细讲解了springAOP的多种实现方式,IOC在项目中的实际应用。</span></span>n</p>
spring AOP联盟通知类型
AOP联盟通知类型 AOP联盟为通知Advice定义了org.aopalliance.aop.Advice Spring按照通知Advice在目标类方法的连接点位置,可以分为5类 前置通知 org.springframework.aop.MethodBeforeAdvice 在目标方法执行前实施增强 后置通知 org.springframework.aop.AfterReturningA...
Spring之面向切面编程(AOP)四种通知
面向切面编程(AOP)面向切面的编程:指很多功能都有重复的代码,把这些重复的代码独立出来实现,再在运行的时候动态加入“切面类代码”。AOP是一种设计思想,和具体的代码实现无关。优点:      A、把共性功能和核心业务功能解耦。      B、共性代码的复用性      C、动态删除或增加切面类,不影响原来的代码Aop的实现前置通知,后置通知,环绕通知、异常通知用添加日志文件为例,描述前置通知,后...
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数