Синтаксис Spring AOP Pointcut для AND, OR и NOT - PullRequest
18 голосов
/ 15 февраля 2010

У меня проблемы с определением 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).

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

Ответы [ 3 ]

21 голосов
/ 07 мая 2010

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

5 голосов
/ 15 февраля 2010

Это должно работать ( ссылка на AOP пружины ):

pointcut="execution(* x.y.z.ClassName.*(..))
          && !execution(* x.y.x.ClassName.someMethod(..))"
1 голос
/ 16 июня 2011

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

Интересно, что правильный синтаксис aspectJ имеет вид && , || и ! , но синтаксис и / или / не был добавлен весной сделать работу в XML проще. Из руководства:

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

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

...