Синтаксис 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>

Однако перехватчик вызывается и для некоторого метода.

Затем я попробовал это:

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

Но это не компилируется, так как это недопустимый синтаксис (я получаю исключение BeanCreationException).

Может ли кто-нибудь дать какие-либо советы?


person Odinodin    schedule 15.02.2010    source источник
comment
Рассматривали ли вы возможность вместо этого написать логику аспекта в стиле @AspectJ? Гораздо проще и мощнее написать логику аспекта на Java. Особенно, если вы используете Eclipse с плагином AJDT.   -  person Espen    schedule 26.04.2010


Ответы (3)


я знаю, что на этом этапе, вероятно, немного поздно, но у меня была такая же проблема, и я решил ее, избегая символов амперсанда, поэтому это &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.

person Declan    schedule 07.05.2010


Я также использую spring 2.5.6, и у меня была аналогичная проблема с тем, что ИЛИ не работало, но И работало. Оказывается, что или (в нижнем регистре) действительно работает, так что в этом коде явно есть ошибка.

Интересно, что правильный синтаксис аспекта J — это &&, || и !, но синтаксис and/or/not был добавлен весной чтобы упростить работу с xml. Из руководства:

При комбинировании подвыражений pointcut «&&» неудобно в XML-документе, поэтому вместо «&&», «||» можно использовать ключевые слова «и», «или» и «не». а также '!' соответственно.

Я предполагаю, что, поскольку && является единственным фактически неудобным в xml (нет ничего сложного в том, чтобы поставить | или! в xml), тогда И strong> - единственный, который был должным образом протестирован

person James Scriven    schedule 16.06.2011