4

私はSpring AOPが初めてです。
アノテーション ベースの Spring 構成の使用:

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=true)
@ComponentScan({"sk.lkrnac"})

側面:

@Aspect
@Component
public class TestAspect {
    @Before("execution(* *(..))")
    public void logJoinPoint(JoinPoint joinPoint){
        ....
    }

}

スプリング成分:

package sk.lkrnac.testaop;

@Component
public class TestComponent{
    @PostConstruct
    public void init(){
        testMethod();
    }

    public void testMethod() {
        return;
    }
}

Spring フレームワーク自体によって呼び出されるすべてのパブリック メソッドをインターセプトするにはどうすればよいですか? (Spring による TestComponent インスタンスの作成中の TestComponent.init() など) 現在、次のTestComponent.testMethod()呼び出しによってのみインターセプトできます。

TestComponent testComponent = springContext.getBean(TestComponent.class);
testComponent.testMethod();
4

3 に答える 3

6

これは、SpringAOPで発生する一般的な問題です。Springは、アドバイスされたクラスをプロキシすることによってAOPを実現します。あなたの場合、TestComponentインスタンスは、適用されるアスペクトアドバイスの「フック」を提供するランタイムプロキシクラスにラップされます。これは、メソッドがクラスの外部から呼び出された場合に非常にうまく機能しますが、ご存知のように、内部呼び出しでは機能しません。その理由は、内部呼び出しがプロキシバリアを通過しないため、アスペクトをトリガーしないためです。

これを回避するには、主に2つの方法があります。1つは、コンテキストから(プロキシされた)Beanのインスタンスをフェッチすることです。これはあなたがすでに成功を収めて試したことです。

もう1つの方法は、ロード時ウィービングと呼ばれるものを使用することです。これを使用する場合、AOPアドバイスは、クラス定義にバイトコードを挿入することにより、カスタムクラスローダーによってクラスに追加されます(「織り込まれ」ます)。Springのドキュメントにはこれに関する詳細があります。

「コンパイル時ウィービング」と呼ばれる3番目の方法があります。このシナリオでは、AOPアドバイスは、コンパイル時に各アドバイスクラスに静的に織り込まれます。

于 2013-01-02T10:02:41.313 に答える
0

init()明示的な手段がないと傍受することはできません。詳細については、SpringSourceJiraを参照してください。

于 2013-01-01T15:55:21.027 に答える
0

https://stackoverflow.com/a/5786362/6786382で説明されている Don のようなプロキシ オブジェクトを介して、init() から内部 testMethod() を呼び出すこともできます。

于 2016-09-02T07:24:50.807 に答える