Spring と AspectJ を使用して、ロード時に既存の tomcat webapp にアスペクトを組み込むことができるようにしたいと考えています。コンストラクターポイントカットを実行する必要があるため、AspectJ を使用しています。
2 つのテスト シナリオがあります。1 つは私のアスペクトが単純なサーブレット アプリケーションの一部である場合です。アプリケーションにはアスペクトのソースが含まれており、MVN とアスペクト J プラグインを使用して WAR とアスペクトをコンパイルしています。この側面は期待どおりに機能します。2 番目のシナリオは、アスペクトを独自のプロジェクトに分割し、(AJC と AJDT の両方を試しました) を使用して JAR ファイルにコンパイルし、jar ファイルを war/WEB-INF/lib フォルダーに含めた場合です。war ファイルのコンテキストがロードされたときにアスペクトが取得されているようですが、war ファイル内のオブジェクトには適用されていないようです。
アスペクトコードは次のとおりです。
@SuppressWarnings("unused")
public aspect ProjectMonitor{
pointcut constr() : call(com.avaya..*.new(..)) ;
Object around() : constr(){
System.out.println("In Constructor for "
+ thisJoinPointStaticPart.getSignature());
Object ret = proceed();
return ret;
}
pointcut publicOperation() : execution(public * *.*(..));
Object around() : publicOperation() {
long start = System.nanoTime();
Object ret = proceed();
long end = System.nanoTime();
System.out.println(thisJoinPointStaticPart.getSignature() + " took "
+ (end - start) + " nanoseconds");
return ret;
}
pointcut callConst() : call(public *..*SCESession.new(..));
public Object callConst(ProceedingJoinPoint jp) throws Throwable {
System.out.println("In Project Monitor!!!");
return jp.proceed();
}
}
Web アプリ/META-INF フォルダーに aop.xml ファイルを含めました。
<aspectj>
<aspects>
<aspect name="com.ddvc.ivr.ProjectMonitor" />
</aspects>
</aspectj>
そして、私の Spring Context ファイルは次のようになります。
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:load-time-weaver aspectj-weaving="on" />
<context:spring-configured />
<context:component-scan base-package="com.avaya.sce.runtimecommon"/>
<context:annotation-config />
<aop:aspectj-autoproxy />
<!-- Aspect Mapping -->
<bean id="monitor" class="com.ddvc.ivr.ProjectMonitor" factory-method="aspectOf"/>
</beans>
かなり簡単ですよね?-javaagent セットもあります。
export JAVA_OPTS="-Xmx1024M -Xms1024M -server -javaagent:/software/apache-tomcat-6.0.36/lib/spring-instrument-3.2.1.RELEASE.jar"
ソースが WAR ファイルでコンパイルされている場合にこれが機能するのに、クラス パスに JAR ファイルとして含まれている場合はまったく機能しないのはなぜですか。
WAR コンテキスト ファイルがリロードされると、Tomcat ログ ファイルに次のメッセージが複数回表示されます。
11:27:51,285 DEBUG GenericTypeResolver:151 - 具体的なメソッド引数 [{ }]。
任意/すべての返信をお待ちしております。前もって感謝します、グリフ