Я добавляю несколько советов AspectJ в мой Java-проект на основе Spring .Когда я запускаю перехваченный метод один раз, все работает нормально (т.е. совет выполняется).Однако следующий вызов того же самого метода больше не проходит через прокси.
Это мой тестовый код:
@Test
public void testFooOperationIsAdviced() throws Exception {
TestController testController = appContext.getBean("testController");
testController.foo();
testController.foo();
}
Вот метод foo()
:
@Protect()
public void foo() {
System.err.println("foo!")
}
И это важная часть моей конфигурации Spring:
<aop:aspectj-autoproxy />
<bean name="myAdvice" class="mypackage.MyAdvice"/>
<bean id="testController" class="mypackage.MyTestControllerImpl" />
<aop:config>
<aop:aspect id="protectAspect" ref="myAdvice">
<aop:pointcut id="annotatedController" expression="execution(public * mypackage.*+.*(..)) and @annotation(protect)" />
<aop:around pointcut-ref="annotatedController" method="applyProtectionRules" arg-names="protect"/>
</aop:aspect>
</aop:config>
В настоящее время аспект просто выполняет System.err.println("advice")
и pp.proceed()
.
Итак, если мы выполнимВ тесте, приведенном выше, вы ожидаете
совета foo!advice foo!
Однако, что я получаю:
advice foo!
Второй вызов никогда не доходит до совета!И, что еще хуже, целевой метод даже не выполняется .
Есть ли у вас какие-либо подсказки относительно того, почему это происходит?
Примечание 1: Чтобы все стало еще хужеИногда, когда я выполняю с отладчиком и иду шаг за шагом, это работает нормально.Без шуток ...
Примечание 2: Если в конфигурации есть опечатки, они просто опечатки, поскольку я адаптировал исходный код, чтобы сделать его проще.Примите во внимание, что аспект работает для первого вызова.
Примечание 3: Я хочу придерживаться Spring.Я не могу жестко закодировать точки в Java-коде, так как хочу, чтобы пользователь библиотеки предоставил их, и единственный способ, о котором я могу подумать, - позволить им определить блок aop:config
.