java - 在 Spring 中向 Advice 发送外部参数

标签 java spring spring-aop

我需要确保特定方法的执行时间小于指定值。我想做一些类似下面的事情

@Around("execution(* com.foo.bar.executeTask2(..))" + " && someExternalParams(500)")
@Around("execution(* com.foo.bar.executeTask(..))" + " && someExternalParams(5)")
public void checkSLA(ProceedingJoinPoint joinPoint, int maxtime) throws Throwable {

//get staarttime
joinPoint.proceed();
// get endtime

if(endtime - starttime > maxtime)
  System.out.println("Task took longertime");

}

如何使用 Spring AOP 实现这一目标。一种解决方案是从文件中读取 maxtime。有什么想法吗?

最佳答案

您好,您可以创建一个 @SLA 注释并在您的方面从中读取该值。显然,您必须更改建议以匹配该注释,并使用 @SLA 注释标记所有方法。

这与你的方法有点不同,但我认为为这种方面进行注释会更好。这样,您就不必每次想要处理新方法时都更新切入点。只需在该方法中添加注释即可。请参阅下面的示例。

注释:

@Target(METHOD)
@Retention(RUNTIME)
public @interface SLA {
    int maxtime();
}

方面:

@Aspect
public SLAAscpet {
    @Around("execution(@com.foo.bar.SLA * *(..))")
    public void aroundSLAMethod(final JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        SLA annotation = signature.getMethod().getAnnotation(SLA.class)
        int maxtime = annotation.maxtime()
        ...
    }
}

用法:

...
@SLA(maxtime=500)
public void someMethodForSLA() {
     ...
}
...

关于java - 在 Spring 中向 Advice 发送外部参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14691406/

相关文章:

java - FAT JAR 外部的 Spring Boot 属性

java - AspectJ - 记录 HttpServletRequest

java - 带图片和文字的自定义按钮?

Java char数组转int

java - 从服务调用 Jasper 文件

java - 将元数据添加到 java throwable 对象

提交表单后出现 javax.ejb.EJBException

java - 从scala中的字符串计算日期

java - 获取异常 java.lang.NoClassDefFoundError : org/springframework/transaction/interceptor/TransactionInterceptor while executing