Spring AOP аспект вокруг не выполняется
Я хочу посчитать сейчас много, мой метод сработал. Поэтому я использую Around-аспект, но он не работает. Ни с аннотациями, ни с XML. Дабггер показывает, что Аспект не был вызван. К сожалению, не примеры помогли.
TimeCountAspect.java
@Aspect
@Component
public class TimeCountAspect {
@Around("execution(* com.springapp.Calculation.Calculator.calculate(..))")
public Object timeCounterClass(ProceedingJoinPoint joinpoint) {
Object result = null;
try {
System.out.println("Preparing to calculate");
long start = System.currentTimeMillis(); // Before
result = joinpoint.proceed(); // Method invoke
long end = System.currentTimeMillis(); // After
System.out.println("Calculation took " + (end - start)
+ " milliseconds.");
} catch (Throwable t) {
System.out.println("Nothing happend!");
}
return result;
}
}
Он прекрасно видит все классы и они связаны с объявлением bean-компонентов в XML. (Идея IntelliJ показывает это). Фрагмент XML
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<mvc:annotation-driven/>
<mvc:resources mapping="/resources/**" location="/"/>
<!-- Enable AspectJ style of Spring AOP -->
<aop:aspectj-autoproxy/>
<aop:aspectj-autoproxy proxy-target-class="true">
<aop:include name="timeCounterAspect" />
</aop:aspectj-autoproxy>
<bean id="timeCounterAspect" class="com.springapp.Calculation.TimeCountAspect"/>
<aop:config>
<aop:aspect id="timeCount" ref="timeCounterAspect">
<aop:pointcut id="calculation" expression=
"execution(* com.springapp.Calculation.Calculator.calculate(..))"/>
<aop:around
pointcut-ref="calculation"
method="timeCounterClass"/>
</aop:aspect>
</aop:config>
................factories and other things............
</beans>
Фрагмент POM.XML
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspect.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspect.version}</version>
</dependency>
Метод Calculate(), к которому я хочу обратиться. Существует вызов метода (), который вызывает метод Calculate()
public BigDecimal calculate(int numberOfThreads, int precision) {
................
return summ;
}
public BigDecimal call() throws Exception {
return calculate(Calculator.numberOfThreads, Calculator.precision);
}
1 ответ
Вы используете Spring AOP, который работает в прокси-модели. Это означает, что он создает прокси-сервер над реальными компонентами. Хорошо известными ограничениями этой настройки являются:
- перехват только при выполнении метода от внешних вызовов
- незнание местных звонков (или звонки с
this
или жеsuper
) - перехват на
public
только для членов (private
/protected
не может быть перехвачен) - невозможно, чтобы сами аспекты были целью советов от других аспектов.
@Aspect
аннотация в классе помечает его как аспект и, следовательно, исключает его из автоматического проксирования.
Вы пытаетесь перехватить локальные вызовы внутри самого компонента, чего вы не можете достичь с помощью этой установки.
Чтобы преодолеть вышеуказанные ограничения, вам нужно настроить нативную среду ткачества на основе AspectJ.
Рекомендации: Spring-Framework-Reference