21

我在 Spring(2.5.6 版)中的切入点定义有问题。我试图拦截对一个类的所有方法调用,除了给定的方法(下面示例中的 someMethod)。

<aop:config>
    <aop:advisor
         pointcut="execution(* x.y.z.ClassName.*(..)) AND NOT
                   execution(* x.y.x.ClassName.someMethod(..))"
    />
</aop:config>

但是,也会为 someMethod 调用拦截器。

然后我尝试了这个:

<aop:config>
    <aop:advisor
         pointcut="execution(* x.y.z.ClassName.(* AND NOT someMethod)(..)) )"
    />
</aop:config>

但这不会编译,因为它不是有效的语法(我得到一个 BeanCreationException)。

任何人都可以提供任何提示吗?

4

3 回答 3

21

我知道在这个阶段它可能有点晚了,但我遇到了同样的问题,我通过转义 & 字符来解决它,所以它&amp;&amp; !而不是 'AND NOT' 或 '&& !'。我在 xml 文件中执行此操作

<aop:config>
    <aop:pointcut id="blah" expression="execution(* com.disney.goofy..*.*(..)) &amp;&amp; !@annotation(com.disney.goofy.NonDisneyCharacter)"/>
    <aop:advisor advice-ref="transAdvice" pointcut-ref="blah"/>
</aop:config>

这会将建议应用于 com.disney.goofy 中执行且未使用 NonDisneyCharacter 注释的所有方法

于 2010-05-07T15:10:29.393 回答
6

这应该有效(spring AOP 参考):

pointcut="execution(* x.y.z.ClassName.*(..))
          && !execution(* x.y.x.ClassName.someMethod(..))"
于 2010-02-15T15:29:34.193 回答
2

我也在使用 spring 2.5.6 并且在OR不工作时遇到了类似的问题,但AND 正在工作。事实证明or(小写)确实有效,因此该代码中显然存在错误。

有趣的是,正确的 aspectJ 语法是&& , || , 和! ,但是 spring 添加了 and/or/not 语法以使在 xml 中的工作更容易。从手册:

当组合切入点子表达式时,'&&' 在 XML 文档中很尴尬,因此可以使用关键字 'and'、'or' 和 'not' 来代替 '&&'、'||' 和 '!' 分别。

我猜想因为&&是唯一一个在 xml 中实际上很尴尬的(在 xml 中放置 | 或 ! 没有什么困难),那么AND是唯一一个经过适当测试的

于 2011-06-16T15:27:13.213 回答