我在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)。
任何人都可以提供任何提示吗?
答案 0 :(得分:21)
我知道在这个阶段可能有点晚了但我一直有同样的问题,我通过逃避&符号来解决它所以&& !
而不是'AND NOT'或'&amp;&amp; !”。
我在xml文件中执行此操作
<aop:config>
<aop:pointcut id="blah" expression="execution(* com.disney.goofy..*.*(..)) && !@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 是唯一经过适当测试的