2

Spring AOP AspectJ で奇妙な動作が発生しています。自己呼び出しはアドバイスされるべきではありませんが、私のアプリケーションではアドバイスされています。春のドキュメントから:

ただし、呼び出しが最終的にターゲット オブジェクト (この場合は SimplePojo 参照) に到達すると、 this.bar() や this.foo() など、それ自体で行われる可能性のあるメソッド呼び出しは、この参照であり、プロキシではありません。これには重要な意味があります。これは、自己呼び出しによって、メソッド呼び出しに関連付けられたアドバイスが実行される可能性がないことを意味します。

しかし、私の単純なアプリケーションでは、次のように構成されています。

テストアスペクト

@Aspect
@Component
public class TestAspect {

    private static final Logger logger = LoggerFactory.getLogger(TestAspect.class);

    @Pointcut("execution(* org.mypackage.TestService.method(..))")
    public void participateAroundPointcut(){}

    @Around("participateAroundPointcut()")
    public void testAround(ProceedingJoinPoint joinPoint) throws Throwable{
        logger.debug("Pre-execution;");

        joinPoint.proceed();

        logger.debug("Post-execution");
    }

}

TestService:

@Service
public class TestService {

    private static final Logger logger = LoggerFactory.getLogger(TestService.class);

    public void method(){
        logger.debug("Executing method();");
    }

    public void service(){
        logger.debug("Executing service();");
        this.method();
    }
}

および構成ファイル:

<context:component-scan base-package="org.mypackage" />
<aop:aspectj-autoproxy  proxy-target-class="true" />
<bean id="testAspect" class="org.mypackage.aop.aspects.TestAspect" factory-method="aspectOf"/>

私は自己呼び出しのアドバイスを受けます:

DEBUG: org.mypackage.TestService - Executing service();
DEBUG: org.mypackage.aop.aspects.TestAspect - Pre-execution;
DEBUG: org.mypackage.TestService - Executing method();
DEBUG: org.mypackage.aop.aspects.TestAspect - Post-execution

なぜこれが起こるのか分かりません。

4

3 に答える 3

1

構成はAspectJ実装を使用します。

以下で構成されています <aop:aspectj-autoproxy />(公式ドキュメント)

proxy-target-class="true"Java Dynamic Proxies の代わりに CGLIB プロキシが使用されるとだけ述べています。

CGLIB プロキシを使用して Spring AOP を構成する必要があると思います。その場合、設定文字列は次のようになります。

<aop:config proxy-target-class="true">
...
</aop:config>
于 2013-10-23T19:00:53.957 に答える
1

問題は IDE にある可能性が最も高いです。プロジェクトで AspectJ を有効にして Eclipse を使用している場合、AspectJ プラグインはターゲット クラスを織り込みます。IDE の外部でテストを実行してみてください (Maven プロジェクトの場合は実行できますmvn clean test)。期待される動作が表示されるはずです。

于 2013-01-25T11:36:29.477 に答える
0

ただし、呼び出しが最終的にターゲット オブジェクト (この場合は SimplePojo 参照) に到達すると、 this.bar() や this.foo() など、それ自体に対して行われる可能性のあるメソッド呼び出しは、この参照であり、プロキシではありません。これには重要な意味があります。これは、自己呼び出しによって、メソッド呼び出しに関連付けられたアドバイスが実行される可能性がないことを意味します。

これは、AOP がプロキシ モード (デフォルト) で動作するように構成されているが、クラス外からの呼び出しと自己呼び出しの両方を処理するアスペクトを構成した場合にのみ当てはまります。

于 2013-01-25T11:15:24.650 に答える