Spring AOP (Аспект) Не выполняется
Я использую Spring 2.5.6, asm 1.5.3, aspectjrt/aspectjweaver 1.6.1, cglib 2.1_3
В моем веб-приложении Spring у меня есть следующий класс:
package uk.co.txttools.aspects;
@Aspect
public class LoggingAspect {
@Before("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.set*(..))")
public void setLoggingAdvice(){
System.out.println("********************************* Advice run..... set mothod called....");
}
@AfterThrowing("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.onSubmit(..) throws java.lang.Exception)")
public void hadleException(){
System.out.println("================= PreviewMessageController =========== ON SUBMIT Exception Throwen ==================");
}
@Before("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.onSubmit(..) throws java.lang.Exception)")
public void OnSubmitAspect(){
System.out.println("================= PreviewMessageController =========== ON SUBMIT CALLED ==================");
}
}
У меня есть один Controller:uk.co.txttools.web.controller.compose.PreviewMessageController
which has
файл onSubmit() method, which get called from web page.
I have separate
applicationContext.xml`.
Мой springapp-servlet.xml
(который используется в файле web.xml с файлом org.springframework.web.servlet.DispatcherServlet) выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="loggingAspect" class="uk.co.txttools.aspects.LoggingAspect" />
.
.
Ниже в том же файле xml PreviewMessageController
get initialize, что означает, что мой контроллер и Aspect live - это тот же контейнер.
Я не получаю исключения при запуске приложения, но мой класс аспект LoggingAspect
никогда не вызывается.
Я не уверен, что это пропало, или я ошибаюсь.
Пожалуйста, помогите мне..
Спасибо
Ответы
Ответ 1
Наконец, РЕШИТЕ его.
Я думаю, что мне не хватает плагина aspectj-maven. Для spring потребовалось плетение аспектов. Однако ни один учебник не предоставляет эту информацию. Добавлено следующее к моему pom.xml.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
Спасибо, ребята,
Ответ 2
Я не уверен, правильно ли я сделал это, но для меня это решило добавить @Component
в класс "Aspect'ed" -
@Aspect
@Component
public class PerformanceLogger {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Around("within(com.something.rest.service..*)")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object retVal = pjp.proceed();
long end = System.currentTimeMillis();
logger.debug(pjp.getSignature().toShortString() + " Finish: " + (end - start) + "ms");
return retVal;
}
}
(И просто, чтобы закрыть цикл - если вы используете аннотацию, не забудьте добавить @EnableAspectJAutoProxy
в свой класс Config.
@EnableAspectJAutoProxy
Ответ 3
Для тех, кто выбрал JavaConfig
, вы можете объявить свой Aspect
как bean и добавить аннотацию @EnableAspectJAutoProxy
для включения автоматического проксирования:
@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class MyConfig {
@Bean
public LoggingAspect loggingAspect(){
return new LoggingAspect();
}
}
Ответ 4
Если вы уже не пробовали... попробуйте конфигурацию spring -aop на основе xml следующим образом:
<aop:config>
<aop:aspect ref="loggingAspect">
<aop:pointcut expression="execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.set*(..))" id="previewMessageControllerSetters"/>
<aop:before method="setLoggingAdvice" pointcut-ref="previewMessageControllerSetters"/>
// set other 2 pointcuts similarly....
</aop:aspect>
</aop:config>
<bean id="loggingAspect" class="uk.co.txttools.aspects.LoggingAspect" />
Ответ 5
Попробуйте в конфигурационном файле:
<aop:aspectj-autoproxy proxy-target-class="true">
<aop:include name="loggingAspect"/>
</aop:aspectj-autoproxy>
Ответ 6
Только чтобы завершить список возможных ответов:
Мне кажется, что в вашем maven pom.xml отсутствует следующая зависимость:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>2.5.6</version>
</dependency>