Spring AOP - 自定义注解实现共性需求
在pom文件中引入依赖
<!--Spring切面类底层的依赖-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
构建自定义注解
//注解的作用目标,表示该注解用在方法上
@Target(ElementType.METHOD)
//注解的保留时间,表示注解在运行时保留
@Retention(RetentionPolicy.RUNTIME)
//@interface:用来说明是个注解类
public @interface MethodExporter {
}
切面类
//说明当前对象是个切面
@Aspect
//将当前对象交给Spring IOC实例化并管理
@Component
//用于打印日志
@Slf4j
public class MethodExporterAspect {
//@Around环绕通知,最强大的通知类型,可以控制方法入参、执行、返回结果等各方面细节
//里面的表达式@annotation用来说明某个方法上书写了MethodExporter注解的话就会执行下面的方法
//对目标方法进行增强
@Around("@annotation(com.meteorological.aop.MethodExporter)")
public Object methodExporter(ProceedingJoinPoint joinPoint) throws Throwable{
long st = System.currentTimeMillis();
//joinPoint:连接点;执行目标方法,获取返回值; proceed:继续进行
Object proceed = joinPoint.proceed();
long et = System.currentTimeMillis();
ObjectMapper mapper = new ObjectMapper();
//将入参JSON序列化
String jsonParam = mapper.writeValueAsString(joinPoint.getArgs());
//将返回结果JSON序列化
String jsonResult = null;
if (proceed!=null){
jsonResult = mapper.writeValueAsString(proceed);
}else {
jsonResult = "null";
}
//模拟上报过程
log.info("正在上报服务器调用过程:\ntarget:{}.{}()\nexecution:{}ms,\nparameter:{}\nresult:{} "
,joinPoint.getTarget().getClass().getSimpleName()
,joinPoint.getSignature().getName()
,(et-st)
,jsonParam
,jsonResult);
return proceed;
}
}
测试自定义注解
@RestController
@RequestMapping(value = "/aopTest")
public class TestController {
@MethodExporter
@RequestMapping(value = "/insert")
public Result<Object> insert( String str) {
return Result.success("insert " + str);
}
}
输出结果,成功使用AOP+自定义注解的方式增强方法
target:TestController.insert()
execution:4ms,
parameter:["str123"]
result:{"code":0,"msg":"success","data":"insert str123"}
原文地址:https://blog.csdn.net/weixin_43732943/article/details/140296915
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!