私はSpring 2.5.6、asm 1.5.3、aspectjrt/aspectjweaver 1.6.1、cglib 2.1_3を使用していますが、私のWebベースの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 ==================");
}
}
私は1つを持っている 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
(org.springframework.web.servlet.DispatcherServletを含むweb.xmlファイルで使用される)ファイルは次のようになります。
<?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は、コントローラーとアスペクトのライブが同じコンテナーであることを意味します。
アプリケーションの実行中に例外は発生しませんが、アスペクトクラスLoggingAspect
が呼び出されません。何が欠けているのかわからない、または間違っています。私を助けてください..
ありがとう
最後にそれを解決しました。
私はaspectj-maven-pluginが欠けていたと思います。春の様相織りに必要でした。ただし、この情報を提供するチュートリアルはありません。以下を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>
みんなありがとう
私がそれを適切に行ったかどうかはわかりませんが、私にとってそれを解決したのは「アスペクト」クラスに@Component
を追加することでした-
@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
JavaConfig
を選択した場合は、Aspect
をBeanとして宣言し、@EnableAspectJAutoProxy
アノテーションを使用して自動プロキシをオンにします。
@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class MyConfig {
@Bean
public LoggingAspect loggingAspect(){
return new LoggingAspect();
}
}
まだ試していない場合は、次のようにxmlベースのspring-aop構成を試してください。
<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" />
これを設定ファイルで試してください:
<aop:aspectj-autoproxy proxy-target-class="true">
<aop:include name="loggingAspect"/>
</aop:aspectj-autoproxy>