8

プリミティブな Pointcut と Advise メソッドを使用して単純な Aspect を作成しました。

@Aspect
public class MyAspect {

  @Pointcut("execution(static * com.mtag.util.SomeUtil.someMethod(..))")
  public void someMethodInvoke() { }

  @AfterReturning(value = "someMethodInvoke())", returning = "comparisonResult")
  public void decrementProductCount(List<String> comparisonResult) {
    //some actions
  }
}

次の Spring アノテーションベースのアプリケーション構成があります。

@Configuration
@EnableAspectJAutoProxy
public class AppConfig { 
  //...
}

および 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 アノテーションを追加して、Spring で SomeUtil Bean を管理し、次のようにターゲット メソッドを呼び出します。

@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(...);
    }
}

全て大丈夫。

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

4

1 に答える 1

8

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

簡単に言えば、同じ注釈を使用する必要がありますが、追加の構成が必要です。

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

<context:load-time-weaver/>

(あなたの状況では必要ないかもしれません)

2) 残念ながら、META-INF/aop.xml も追加する必要があります。例:

<weaver>
    <include within="com.example.ClassA"/> <!-- path to concrete class -->
    <include within="com.log.* "/> <!—- path to aspects package -->
</weaver>
<aspects>
    <aspect name="com.log.AspectA"/>
</aspects>

3) JVM起動時の引数

-javaagent:${PATH_TO_LIB }/aspectjweaver.jar

追加する必要があります。

したがって、この解決策はかなり面倒です。

詳細については、7.8.4 の章を参照してくださいhttp://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

于 2014-09-11T07:44:46.303 に答える