2012-12-06 1 views
5

に助言しますcom.mtag.utilパッケージ:は、私は原始的なポイントカットと簡単なアスペクトを書いおよび方法をアドバイスしている静的メソッドの

public class SomeUtil { 
    static List<String> someMethod(List<String> oldList, List<String> newList) { 
    //... 
    } 
} 

が、私は呼んで

SomeUtil.someMethod(arg1, arg2); 

ユニットテストでは、メソッド呼び出しが傍受されず、@AfterReturningのアドバイスが機能しないことがわかります。

しかし、私はのsomeMethodを(変更した場合)インスタンスへの(非静的)メソッド、

@Pointcut("execution(* com.mtag.util.SomeUtil.someMethod(..))") 

にポイントカットを入力し@Component注釈とコールターゲットを追加することにより、ばねによってSomeUtil Beanを管理するが、このようmetod:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {AppConfig.class}, loader = AnnotationConfigContextLoader.class) 
public class SomeUtilTest { 

    @Autowired 
    private SomeUtil someUtil; 

    @Test 
    public void categoriesDiffCalc() { 
     List<String> result = someUtil.someMethod(...); 
    } 
} 

すべては問題ありません。

どのように私は静的メソッドのアドバイスを設定できますか?

+0

を7.8.4章を読んで、 '@AfterReturning(値は= "someMethodInvoke())"'あなたは余分なブラケット – tibtof

+0

@izhamoidsinを持っている、(私が)提供さ答えが受け入れられています。またはこれは間違っていますか? –

答えて

4

実際には、Springフレームワークで自動プロキシを使用して静的メソッドを代行する方法はありません。 LWT AspectJソリューションを使用する必要があります。

簡単に言えば、同じ注釈を使用する必要がありますが、いくつかの追加設定が必要です。

1)春のコンテキストファイルに次の行を追加します。

<context:load-time-weaver/> 

(それは必要ありませんあなたの状況にあってもよい)

2)残念ながら、あなたはまた、META-INF/AOPを追加する必要があります。 xml。例:

<weaver> 
    <include within="com.example.ClassA"/> <!-- путь к конкретному классу --> 
    <include within="com.log.* "/> <!—путь к пакету с аспектами> 
</weaver> 
<aspects> 
    <aspect name="com.log.AspectA"/> 
</aspects> 

3)JVMの起動時に引数

-javaagent:${PATH_TO_LIB }/aspectjweaver.jar 

が追加されなければなりません。

このソリューションはかなり面倒です。詳細については

がここhttp://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

+1

良い答え、Eugene。私はこの解決策が面倒だとは思わない。それがセットアップされると永遠に動作します。 :-)とにかく、余分な実行時設定を避けたいのであれば、コンパイル時の織りを使うことができます。 – kriegaex

+0

うん、私は、この解決策が非静的メソッドをインターセプトすることに依存して面倒であることを意味しましたが、私にとっては調査するのが面倒でした。 =) –

+0

コード内のコメントを翻訳できますか? – Kwadz

関連する問題