1

Maven プロジェクトにアスペクト クラスがあります: my-aspect-project

@Aspect
public class LoggingAspect {

@Autowired
public MessageSource messageSource

@Pointcut("execution(@Log * *(..))")
public void executionOfLogAnnotationMethod(){}

@Before(value= "executionOfLoggableAnnotationMethod")
public void logBefore(JointPoint jp){
Logger.log(Level.info,messageSource.getMessage("before.log.message"),new String[] {
jp.getTarget().getClass().getSimpleName(),
jp.getSignature().getName(), 
Arrays.deepToString(jp.getArgs())
});

}

以下のように、mavenでのコンパイル時の織りにaspectj-maven-pluginを使用しました

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj-maven-plugin-version}</version>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
<configuration>
<complianceLevel>${maven.compiler.source}</complianceLevel>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<showWeaveInfo>true</showWeaveInfo>
<forceAjcCompile>true</forceAjcCompile>
<verbose>true</verbose>
<Xlint>warning</Xlint>
<aspectLibraries>
<aspectLibrary>
<groupId>com.mycompany-myproject</groupId>
<artifactId>my-aspect-project</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
</execution>
</executions>
</plugin>

アスペクトは期待どおりに機能し、@Log で注釈が付けられたメソッドが呼び出されるたびにアドバイスが呼び出されますが、その結果、アスペクトで autowired された messageSource が null になり、プロパティ ファイルが読み取られず、ログ メッセージが null になります。

私はスプリング ブート アプリケーションを使用していますが、xml は使用されていません。

私はこれを読んだ [ http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-configure ]私の場合、これがどのように機能するかわかりません。

以下のように Appconfig で Bean を定義しようとしましたが、

@Bean()
public LoggingAspect loggingAspect() {
    LoggingAspect loggerAspect =  Aspects.aspectOf(LoggingAspect.class);
    loggerAspect.messageSource = messageSource;//Autowired in same class
    return loggerAspect;
}

これも機能していません。また、まったく呼び出されない Bean メソッド loggingAspect() にデバッグ ポイントを追加しました。

お知らせください。

1) @Aspect でアノテーションが付けられたアスペクト クラスで動作するようにスプリング アノテーションを作成する方法を教えてください。

2)また、スプリング プロファイルを使用してアスペクトを有効または無効にしたいのですが、スプリング アノテーションがアスペクトで機能しないため、これを機能させる方法がわかりません。

前もって感謝します

4

0 に答える 0