应用场景
灵活使用共性需求
- 收集上报指定关键方法的入参、执行时间、返回结果等关键信息,用作后期调优
- 关键方法在幂等性前置校验(基于本地消息表)
- 类似于Spring-Retry模块,提供关键方法多次调用重试机制
- 提供关键方法自定义的快速熔断、服务降级等职责
- 关键方法的共性入参校验
- 关键方法在执行后的扩展行为,例如记录日志、启动其他任务等
依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.9.1<version>
</dependency>
代码实现
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) // 保留在运行时
@Target(ElementType.METHOD) // 用在方法上
public @interface MyAction {
//String value(); //可以在注解上传入参数
}
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
//import java.lang.reflect.Method;
//import org.aspectj.lang.reflect.MethodSignature;
import com.fasterxml.jackson.databind.ObjectMapper;
@Aspect // 说明当前对象是一个切面
@Component
public class OpenApiAdvice {
@Around("@annotation(com.berheley.bi.datacenter.main.indexsystem.MyAction)") // 可以控制入参、执行、返回结果等
public void methodExporter(ProceedingJoinPoint joinPoint) throws Throwable {
boolean flag = false;
ObjectMapper mapper = new ObjectMapper();
String jsonParam = mapper.writeValueAsString(joinPoint.getArgs());//将入参Json序列化,获取方法传入的参数
Object proceed = joinPoint.proceed();//执行方法,如果不加不会执行添加注解的方法
//MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//Method method = signature.getMethod();
//MyAction myAction = method.getAnnotation(MyAction.class);//获取注解传入的参数
}
使用
//@MyAction("出入参数")
@MyAction
public void aa(@RequestParam(required = false) String aa, @RequestParam(required = false) String bb) {
}