2

特定の前後のパターンに常に従わなければならないいくつかのクラスのメソッドが必要です。

public void method(X x, Y y ) {

// ************繰り返し部分開始 ******************/

AFrameworkClass aFrameworkClass = new AFrameworkClass (this.memberVariable,"SomeString");

試す {

  aFrameworkClass.aFrameworkMethod( x,y); 
  aFrameworkClass.anotherFrameworkMethod(x,y); 
  aFrameworkClass.yetAnotherFrameworkMethod(x);   
  aFrameworkClass.doPreProcessing(); 

  Throwable t = null ; 

// ************繰り返し部分終了 ******************/

  try { 
     // code will vary according to the business logic 
  } 
  catch (Throwable t) { 
     // code will vary according to the business logic   
  } 

// ************繰り返し部分開始 ******************/

  aFrameworkClass.doPostProcessing(); 

} 最後に { aFrameworkClass.doCleanup();

}

// ************繰り返し部分終了 ******************/

}

Spring フレームワークを使用して、このメソッドの繰り返し部分のロジックを、さまざまなクラスで何度も何度もコード化することなく実現することはできますか? もしそうなら、どのように?

4

3 に答える 3

2

Spring の AOP サポートを使えば、もちろんそれは可能です。最初の部分を「前」のアドバイスとして適用し、2 番目の部分を「最終後」のアドバイスとして適用するか、両方を「前後」のアドバイスとして適用し、次のようにターゲット メソッドをプログラムで呼び出すことができます。

methodInvocation.invoke(); // returns Object

XML でアスペクトを宣言する場合は、ここでその方法について読むことができます。

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema http://static.springframework.org/spring/docs/2.5.x/reference/aop.html #aop-schema-advice-before http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema-advice-after-finally http://static.springframework.org /spring/docs/2.5.x/reference/aop.html#aop-ataspectj-around-advice

または、注釈でそれを行いたい場合は、ここに情報があります:

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj

アプリケーションを再コンパイルせずにアスペクトの動作を変更できるため、個人的には XML を使用することを好みます。B が A に依存するマルチモジュール プロジェクトがあるとします。A には再利用可能なアドバイスが含まれており、順序、ポイントカットなどの注釈を使用しています。その動作を変更する必要がある場合は、A を再構築する必要があります。プロジェクト B で XML を使用している場合プロジェクト A からアスペクトを構成するために、A の再構築は必要ありません。

クラスで動作を定義し、その動作を XML でどのように適用するかを定義すると、アドバイスがより再利用可能になると思います。

于 2009-01-12T23:13:41.177 に答える
1

本格的な IoC コンテナーの代わりに、デリゲートを使用して同じことを実現できます。プリ関数とポスト関数、およびデリゲートを使用して基本クラスを設計し、さまざまなビジネス ロジック関数を挿入します。「RunProcess」基本クラス関数は、事前操作、デリゲート、および事後操作を呼び出します。

于 2009-01-12T23:25:20.513 に答える
0

brd6644 は正しいですが、私が発見したことの 1 つは、オブジェクトを作成しているときにアドバイス/アドバイザーをプロパティに適用できないという Spring AOP の問題です。

つまり、次のようなものがあるとします

<bean class="...ProxyBeanFactory">
    <property name="target">
        <bean class="myBean">
            <property name="username" value="helloKitty"/>
            <property name="password" value="lkajdahdkahjdkhja"/>
        </bean>
     </property>
 </bean>

プロキシーが作成される前にプロパティー値が提供されるため、myBean のパスワードを復号化するためのアドバイザーを作成することはできません。もちろん、パスワード プロパティを ProxyBeanFactory クラスに適用することはできません。本当にやりたいことは、「lkaj...」引数を使用して ProxyBeanFactory から返されたオブジェクトで setPassword() を呼び出すことですが、それは不可能のようです。

于 2009-01-12T23:24:12.060 に答える