Coding365 2018-02-20 03:28 采纳率: 0%
浏览 1369
已结题

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

下面是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条回答

  • rabbit_hog 2018-02-20 12:00
    关注

    我试了一下
    如果不改配置,那么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提供了一种方式用来访问切点中的参数并传递给通知方法?

    评论

报告相同问题?

悬赏问题

  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用