可以采用int / Integer的方法的切入点

时间:2016-08-10 17:41:22

标签: java aop 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? 不,我不想要

执行(* com.ExternalSevice.getData(..))

1 个答案:

答案 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