2

プロジェクトで 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());
    }
}
4

3 に答える 3

3

個人的には、Aspect ポイントカット構成をアプリケーション コンテキストに配置することを好みますが、aop:aspect に ref がありません。

 <bean id="mySessionMonitor"   class="my.app.aspects.SessionMonitoringAspect" />

 <aop:config proxy-target-class="true">
  <aop:aspect ref="mySessionMonitor">
   <aop:pointcut id="around" expression="execution (public * *(..))"/></aop:pointcut>
   <aop:around pointcut-ref="around" method="aroundAdvice"/>
  </aop:aspect>
 </aop:config>
于 2010-08-12T07:01:01.000 に答える
0

initialise()メソッドがの一部ではないことを願っていmy.app.session.SessionImplます。もしそうならinitialise()、あなたのアスペクトの方法は発火しません。Beanクラスからアスペクトのメソッドを呼び出すことができないためです。my.app.session.SessionImplそれ以外の場合は、詳細を理解するためにコードを添付してください。

于 2010-08-05T05:53:54.843 に答える
0

注釈ベースの構成を好む場合は、私が書いたこの例を参照してください。XML 構成で必要なのは<aop:aspectj-autoproxy />.

于 2010-08-19T23:05:56.400 に答える