3

私は、Spring の @Service ステレオタイプで注釈が付けられた ServiceImpl を使用し、Spring によってインターセプトされるカスタム注釈で注釈が付けられた 2 つのメソッドをそれぞれに持っています。

@Service    
public class ServiceImpl implements Service{

       @CustomAnnotation
       public void method1(){
       ...
       }

       @AnotherCustomAnnotation
       public void method2(){
        this.method1();   
        ...
       }
    }
}

現在、Spring はプロキシ ベースの AOP アプローチを使用しているthis.method1()ため、@CustomAnnotation にインターセプターを使用しているため、この呼び出しをインターセプトできません。以前は、このサービスを別の FactoryClass に注入していたため、次のようなプロキシ インスタンスを取得できました -

  @AnotherCustomAnnotation
    public void method2(){
        someFactory.getService().method1();   
        ...
    }

現在、Spring 3.0.x を使用していますが、プロキシ インスタンスを取得する最良の方法はどれですか?

4

3 に答える 3

3

もう 1 つの方法は、AspectJ と @Configurable を使用することです。最近は春が近づいているようです(好意)。

Spring 3 を使用している場合は、プロキシ ベースの AOP よりも高速 (パフォーマンス) で柔軟性があるため、調査します。

于 2011-02-23T13:21:21.837 に答える
1

どちらのメソッドも同じプロキシ内にありますが、AOP 機能は外部からの呼び出しを強化するだけです ( AOP プロキシについてを参照してください)。この制限に対処するには、次の 3 つの方法があります。

  1. デザインを変更する (これをお勧めします)
  2. プロキシ タイプを JDK-proxy から proxy-target-class (CGLib ベースのサブクラス化)に変更します。
  3. 使用((Service)AopContext.currentProxy()).method1()(動作しますが、AOP のひどい違反です。AOP プロキシの理解の最後を参照してください)
于 2011-02-23T13:08:04.523 に答える
0

ServiceImpl クラスにBeanFactoryAwareインターフェースを実装させ、提供された Bean ファクトリのおかげでそれ自体をルックアップできます。しかし、これはもはや依存性注入ではありません。

最善の解決策は、既存のサービス Bean に注入され、既存のサービス Bean が委譲する別のサービス Bean に method1 を配置することです。

于 2011-02-23T13:06:04.850 に答える