Spring AOP Синтаксис Pointcut для AND, OR и NOT
У меня возникают проблемы с определением pointcut в 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).
Кто-нибудь может дать какие-либо советы?
Ответы
Ответ 1
Я знаю, что он, вероятно, немного опоздал на этом этапе, но у меня была такая же проблема, и я разрешил ее, избегая символов амперсандов, поэтому его && !
вместо "AND NOT" или "& &!".
Я делаю это в XML файле
<aop:config>
<aop:pointcut id="blah" expression="execution(* com.disney.goofy..*.*(..)) && [email protected](com.disney.goofy.NonDisneyCharacter)"/>
<aop:advisor advice-ref="transAdvice" pointcut-ref="blah"/>
</aop:config>
Это относится ко всем методам, выполняемым в com.disney.goofy и которые не аннотируются с помощью NonDisneyCharacter
Ответ 2
Это должно работать (spring ссылка AOP):
pointcut="execution(* x.y.z.ClassName.*(..))
&& !execution(* x.y.x.ClassName.someMethod(..))"
Ответ 3
Я также использую spring 2.5.6 и имею аналогичную проблему с ИЛИ, но не работает И. Оказывается, что или (в нижнем регистре) работает, поэтому в этом коде есть ошибка.
Интересно, что правильный синтаксис aspectJ - &&, || и !, но и/не был добавлен синтаксис spring, чтобы упростить работу в xml. Из руководства:
При объединении pointcut вспомогательные выражения, && неудобно в XML-документе, и поэтому ключевые слова 'и', 'или' и 'не' могут быть используется вместо '&', '||' а также '!' соответственно.
Я бы предположил, что поскольку && является единственным, что на самом деле неудобно в xml (нет ничего сложного в том, чтобы положить | или! в xml), тогда И является единственным, который был правильно протестирован