2016-08-10 7 views
0

외부 서비스를 캐싱하려고합니다. 이를 달성하기 위해 나는 pointcut을 정의하고있다. 때문에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

그것은 실제로 매우 간단합니다. 당신은 args()를 통해 조언 매개 변수 매개 변수 유형을 결합하고 자바를 자동 언 박싱 즐길 :

드라이버 응용 프로그램 :

나는 일반 자바에서이 일을 준비합니다. 그것은 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