首页 > 其他分享 >AOP的基本使用

AOP的基本使用

时间:2024-07-02 21:56:20浏览次数:12  
标签:基本 Object AOP System -------------------- 使用 println public out

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestLog {

}
@Slf4j
@Aspect
@Component
public class RequestLogAspect {
@Around(“@within(org.springframework.stereotype.Controller) || @within(org.springframework.web.bind.annotation.RestController))”)
public Object aroundApi(ProceedingJoinPoint joinPoint) throws Throwable {
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature)signature;
Method targetMethod = methodSignature.getMethod();
if(!targetMethod.isAnnotationPresent(RequestLog.class)) {
return joinPoint.proceed();
}
HttpServletRequest request = WebUtil.getRequest();
log.info(“{} : {}”, request.getRequestURI(), JSON.toJSONString(parseArgs(targetMethod, joinPoint.getArgs())));
return joinPoint.proceed();
}
public List parseArgs(Method method, Object[] args) {
Map<String, Object> paraMap = new HashMap<>(16);
Object requestBodyValue = null;
List reqArgs = Lists.newArrayList();
if (!paraMap.isEmpty()) {
reqArgs.add(paraMap);
}
if (requestBodyValue != null) {
reqArgs.add(requestBodyValue);
}
return reqArgs;
}
}
@Aspect
@Component
public class LogAspect {
/**

  • 定义切入点,切入点为 spring.aop.ProductController 类下的所有方法
    /
    @Pointcut("execution(public * spring.aop.ProductController.(…))“)
    public void log() {
    }
    /**
  • 前置通知:在连接点方法执行之前执行
    /
    @Before(“log()”)
    public void doBefore(JoinPoint joinPoint) {
    System.out.println((“-------------------- 前置通知逻辑 --------------------”));
    }
    /*
  • 后置通知:在连接点方法执行之后执行,即使连接点方法发生异常也会执行
    /
    //@After(“log()”)
    public void doAfter() {
    System.out.println(“-------------------- 后置通知逻辑 --------------------”);
    }
    /*
  • 返回通知:在连接点方法返回结果后执行,即连接点方法若发生异常则不会执行
  • str为方法返回值的引用,参数名称可以自定义
    /
    //@AfterReturning(pointcut = “log()”, returning = “str”)
    public void doAfterReturning(Object str) {
    System.out.println(“返回通知逻辑…” + str);
    }
    /*
  • 异常通知:在连接点方法发生异常之后执行
    /
    //@AfterThrowing(“log()”)
    public void doAfterThrowing() {
    System.out.println(“异常通知逻辑…”);
    }
    /*
  • 环绕通知:在连接点方法执行之前和执行之后执行
    */
    //@Around(value = “log()”)
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) { // 其它通知类型的方法也可以加上形参 ProceedingJoinPoint proceedingJoinPoint
    System.out.println(”-------------------- 环绕通知执行开始 --------------------“);
    Object result = null;
    //获取方法所需参数
    Object[] args = proceedingJoinPoint.getArgs();
    System.out.println(“aaa…”);
    try {
    result = proceedingJoinPoint.proceed(args);
    System.out.println(“bbb…”);
    } catch (Throwable throwable) {
    throwable.printStackTrace();
    System.out.println(“ccc…”);
    }finally {
    System.out.println(“result : {} " + result);
    System.out.println(“ddd…”);
    }
    System.out.println(”-------------------- 环绕通知执行结束 --------------------”);
    // 返回结果,此处可改变方法的返回结果
    //return result;
    return null;
    }
    }
    @Component
    public class ProductController {
    public String save() {
    System.out.println(“保存产品信息”);
    //int i = 1/0;
    return “hello”;
    }
    }

标签:基本,Object,AOP,System,--------------------,使用,println,public,out
From: https://www.cnblogs.com/chaoshang8/p/18280582

相关文章

  • aop
    @Aspect@ComponentpublicclassLogAspect{/***定义切入点,切入点为spring.aop.ProductController类下的所有方法/@Pointcut("execution(public*spring.aop.ProductController.(..))")publicvoidlog(){}/***前置通知:在连接点方法执行之前执行/@Before("log()......
  • 数据分表——使用 Mybatis-Plus插件实现动态表名分表(按年份分表、按月份分表)
    本博客适合Mybatis-Plus3.4以上版本,笔者使用版本为3.5.3。分库与分表的原因1.业务场景:日志、交易流水表或者其他数据量大的表,通过日期进行了水平分表,需要通过日期参数,动态的查询数据。实现思路:利用MybatisPlus的动态表名插件DynamicTableNameInnerInterceptor,实现Sql执行......
  • 【Java学习笔记】方法的使用
    【Java学习笔记】方法的使用一、一个例子二、方法的概念及使用(一)什么是方法(二)方法的定义(三)方法调用的执行过程(四)实参和形参的关系(重要)(五)没有返回值的方法三、方法重载(一)为什么需要方法重载(二)方法重载概念(三)方法签名四、递归(一)生活中的故事(二)递归的概念(三)递归执行过程分......
  • 如何通过指纹浏览器使用代理IP?
    1.指纹浏览器定义指纹浏览器是&nbsp;一种浏览器技术,它根据用户设备的硬件、软件和配置等特征生成唯一标识符(称为“指纹”)。此指纹用于识别和追踪用户身份,即使用户更改其IP地址或清除浏览器数据(如缓存和Cookie)也是如此。指纹浏览器会&nbsp;收集用户设备的信息,包括操作系统......
  • 【Spring Boot】Spring AOP中的环绕通知
    目录一、什么是AOP?二、AOP的环绕通知2.1切点以及切点表达式2.2连接点2.3通知(Advice)2.4切面(Aspect)2.5不同通知类型的区别2.5.1正常情况下2.5.2异常情况下2.6统一管理切点@PointCut一、什么是AOP?AspectOrientedProgramming(面向切面编程)AOP是Spring框......
  • 使用nodejs ws模块连接websocket服务器Unexpected response code: 403错误解决
    使用浏览器连接websocket服务器时一切正常,但是使用nodejs ws模块连接时一直报Unexpectedresponsecode:403错误,查了很多帖子都没说明白,最后自己试着一点一点对比模拟浏览器请求头,最终解决问题,解决后代码如下://TODO不加这个,会报403错误constoptions={headers:{......
  • dig 命令详解及使用示例
    一、背景知识CNAMECNAME是CanonicalName的缩写,它是DNS(域名系统)记录的一种类型。CNAME记录用于将一个域名映射(别名)到另一个域名。换句话说,当你访问一个设置了CNAME记录的域名时,你实际上被重定向到了另一个域名。例如,假设你有一个域名www.baidu.com,你想让用户通过examp......
  • [Python]使用python处理PDF,在PDF中某一页加一行文字,另存成一个新的文件
    本文参考链接:https://blog.csdn.net/Anq1_/article/details/111144032一、需求分析我有一个数据文件(data.xlsx),里面是序号和班级信息;还有一个PDF文件,每一页里是格式化的信息,其中包含序号,且序号唯一。遍历PDF每个页面,找到序号对应的班级,加在左下角 二、实现过程找了很多方法......
  • postman使用笔记
    Postman是一个广泛使用的API开发工具,它提供了一个用户友好的图形界面来发送HTTP请求、查看响应、组织测试用例和创建自动化测试。以下是一些基本的Postman使用教程,结合了搜索结果中的信息:安装Postman访问Postman官方网站下载适用于Windows、MacOS和Linux的......
  • 使用 LEFT JOIN 时,将条件写在 ON 子句和 WHERE 子句的区别
    1.条件写在ON子句中当条件写在ON子句中时,条件会在进行连接操作时立即应用。这意味着只要左表中的行存在,不论右表中的行是否满足条件,左表的行都会包含在结果集中。如果右表中的行不满足条件,结果集中会显示右表的列为空。示例SELECT*FROMt_useruLEFTJOINt_user_role......