Spring AOP and AspectJ on same method(Spring AOP和AspectJ采用相同的方法)
问题描述
我有一个关于使用AspectJ和Spring AOP方法拦截的问题。我创建了两个批注:@AJTest
和@SAOPTest
。
package com.test.company;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class AJTestAspect {
@Pointcut("@annotation(AJTest)")
public void aJTest() {
}
@Around("aJTest()")
public Object profile(ProceedingJoinPoint joinPoint) throws Throwable {
final long start = System.currentTimeMillis();
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis() - start;
System.out.println("Method execution time: " + (start - finish));
}
}
}
已注册
package com.test.company;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AJConfiguration {
@Bean
public AJTestAspect ajTestAspect() {
return new AJTestAspect();
}
}
和其他
package com.test.company;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class SAOPInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("Number of parameters " + methodInvocation.getArguments().length);
return methodInvocation.getMethod().invoke(methodInvocation.getThis(), methodInvocation.getArguments());
}
}
并注册
package com.test.company;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties
public class SpringSAOPTestConfiguration {
@Bean
public Advisor springAopTestAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("@annotation(com.test.company.SAOPTest)");
return new DefaultPointcutAdvisor(pointcut, new SAOPInterceptor());
}
}
并将其添加到控制器中的我的方法
package com.test.company;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@SAOPTest
@AJTest
@GetMapping("/test")
public String doSomething(@RequestParam("firstParam") String firstParam, @RequestParam("secondParam") Integer secondParam) throws InterruptedException {
Thread.sleep(2_500);
return firstParam + " " + secondParam;
}
}
应用程序类
package com.test.company;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@EnableAspectJAutoProxy
@SpringBootApplication
public class AopTestApplication {
public static void main(String[] args) {
SpringApplication.run(AopTestApplication.class, args);
}
}
但当我通过http://localhost:8080/test?firstParam=test&secondParam=2
调用它时,我看不到与方法执行时间相关的消息,但可以看到传递给该方法的参数数量。如果我要删除@SAOPTest
-方法的执行时间按预期工作,但它不能同时使用两个注释。是Spring创建的代理对象有问题,还是我遗漏了什么?
推荐答案
您的侦听器未正确运行。请阅读MethodInterceptor
javadoc。拦截器应如下所示:
public class SAOPInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("Number of parameters " + methodInvocation.getArguments().length);
return methodInvocation.proceed();
}
}
此外,你的相位计算时间也是错误的。首先,您说finish = System.currentTimeMillis() - start
,然后打印start - finish
。您应该减去finish - start
或计算在变量中花费的时间,但不能同时计算两者,也不能同时计算start - finish
。为什么不干脆System.out.println("Method execution time: " + (System.currentTimeMillis() - start));
?
这篇关于Spring AOP和AspectJ采用相同的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Spring AOP和AspectJ采用相同的方法
基础教程推荐
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01