プロジェクトで Spring AOP を使い始めたばかりで、Spring AOP を正しく機能させるのに問題があります。
AOP を介してプロファイリングしたい TransportImpl と SesssionImpl の 2 つのオブジェクトがあります。両方のオブジェクト (Bean) は、Spring を介して初期化されます。どちらの Bean もビジネス インターフェイス (トランスポートとセッション) の実装です。TransportImpl Bean に適用されたアスペクトを正常に動作させることができますが、SessionImpl に適用されたアスペクトは起動しません。「mySessionMonitor」アスペクトが Spring によって初期化されていること、および SessionImpl オブジェクトも例外やエラーなしで初期化されていることを確認できます。
PointCuts と Aspect を可能な限り最も基本的な形に落とし込みました。SessionImpl Bean が初期化され、init メソッドの初期化が呼び出されたときに、以下で説明するPointCut sessionOperationが起動することを期待していました。しかし、これは決して起こりません。ここで何がうまくいかないのでしょうか?
構成ファイルから:
<bean id="MyTransport" class="my.app.transport.TransportImpl" scope="singleton" />
<bean id="MySession" class="my.app.session.SessionImpl" init-method="initialise" scope="singleton" />
<aop:aspectj-autoproxy proxy-target-class="true">
<aop:include name="myTransportMonitor" />
<aop:include name="mySessionMonitor" />
</aop:aspectj-autoproxy>
<bean id="myTransportMonitor" class="my.app.aspects.TransportMonitoringAspect"/>
<bean id="mySessionMonitor" class="my.app.aspects.SessionMonitoringAspect" />
アスペクトコード
// Aspect monitoring code
@Aspect
public class SessionMonitoringAspect
{
private Logger fileLogger = Logger.getLogger("myLogger");
public void initialise()
{
fileLogger.info("Initialising SessionMonitoringAspect");
}
@Pointcut ("execution (public * *(..))")
private void anyPublicOperation(){}
@Pointcut ("within(my.app.session..*)")
private void inSession(){}
@Pointcut("anyPublicOperation() && inSession()")
private void sessionOperation(){}
@Before("sessionOperation()")
public void sessionOperationDetected(JoinPoint jp)
{
fileLogger.info("Session operation detected - signature: " + jp.getSignature());
}
}