2016-08-10 6 views
0

外部サービスをキャッシュしようとしています。これを達成するために、私はポイントカットを定義しています。int/intをとるメソッドのPointcut

public interface ExternalService 
{ 
    public int getData(int); 
} 

によりキャッシュマネージャのいくつかの懸念がオーバーロードされたメソッドの中で違いを把握することができるという、私はメソッドの引数の型と私のポイントカットを定義する必要はありません。

<aop:config proxy-target-class="true"> 
    <aop:pointcut id="cacheOperation" 
     expression="execution(* com.ExternalSevice.getData(Integer)) || execution(* com.ExternalSevice.getData(int))" /> 
    <aop:advisor advice-ref="cacheAdvise" pointcut-ref="cacheOperation" /> 
</aop:config> 

明日は外部サービスによってメソッドがgetData(Integer)に変更された場合、私のキャッシュはうまく動作します。

質問: メソッド引数(intまたはInteger)にpointcutを定義するにはどうすればよいですか? そして、いや、私は

実行したくない(* com.ExternalSevice.getData(..))

+0

なぜあなたはそれらに答える他人のために仕事を作る、質問をしないし、その後のフィードバックを与えていないか、答えを受け入れるん? – kriegaex

答えて

0

それは実際には非常に簡単です。私は、プレーンJavaでこの1を用意し

:あなただけargs()を経由してアドバイスパラメータにパラメータの型をバインドするとJavaの自動アンボクシングを楽しむ:

ドライバアプリケーション。これはAspectJで動作しますが、以下のアドバイスはSpring AOPでも動作するはずです。

package de.scrum_master.app; 

public class Application { 
    public int getData(int i) { 
     return i + i; 
    } 

    public Integer getMoreData(Integer i) { 
     return i * i; 
    } 

    public String getSomethingElse(String string) { 
     return string + " & " + string; 
    } 

    public static void main(String[] args) { 
     Application application = new Application(); 
     application.getData(11); 
     application.getMoreData(22); 
     application.getSomethingElse("foo"); 
    } 
} 

アスペクト:あなたもcacheOperation(JoinPoint thisJoinPoint, Integer number)を使用することができ

package de.scrum_master.aspect; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 

@Aspect 
public class CacheOperationAspect { 
    @Before("execution(* de.scrum_master..get*Data(*)) && args(number)") 
    public void cacheOperation(JoinPoint thisJoinPoint, int number) { 
     System.out.println(thisJoinPoint + " -> " + number); 
    } 
} 

代わりのcacheOperation(JoinPoint thisJoinPoint, int number)、それはあなたがあなたの側面で使用するかに依存します。

コンソールログ:

execution(int de.scrum_master.app.Application.getData(int)) -> 11 
execution(Integer de.scrum_master.app.Application.getMoreData(Integer)) -> 22 
関連する問題