我正在尝试缓存外部服务。为了实现这一点,我正在定义一个切入点。
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? 不,我不想要
执行(* com.ExternalSevice.getData(..))
答案 0 :(得分:0)
实际上非常简单。您只需通过args()
将参数类型绑定到通知参数,并享受Java自动取消装箱:
驱动程序应用程序:
我用普通的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");
}
}
<强>方面:强>
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)
您也可以使用cacheOperation(JoinPoint thisJoinPoint, Integer number)
,这取决于您想要在您的方面使用什么。
控制台日志:
execution(int de.scrum_master.app.Application.getData(int)) -> 11
execution(Integer de.scrum_master.app.Application.getMoreData(Integer)) -> 22