AND,OR和NOT的Spring AOP Pointcut语法

时间:2010-02-15 15:15:26

标签: spring aop spring-aop

我在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)。

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

3 个答案:

答案 0 :(得分:21)

我知道在这个阶段可能有点晚了但我一直有同样的问题,我通过逃避&符号来解决它所以&amp;&amp; !而不是'AND NOT'或'&amp;&amp; !”。 我在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注释

答案 1 :(得分:5)

这应该有效(spring AOP reference):

pointcut="execution(* x.y.z.ClassName.*(..))
          && !execution(* x.y.x.ClassName.someMethod(..))"

答案 2 :(得分:1)

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

有趣的是,正确的aspectJ语法是&amp;&amp; || ,但是和/或/ spring没有添加语法,以便更容易在xml中工作。从手册:

  

组合切入点时   子表达式,'&amp;&amp;'很尴尬   在XML文档中,等等   关键字'和','或'和'不'可以   用来代替'&amp;&amp;','||'和'!'   分别

我猜是因为&amp;&amp; 是xml中唯一实际上笨拙的人(在xml中放置|或!没什么困难的) AND 是唯一经过适当测试的