一张思维导图带你学会SpringBoot使用AOP实现日志管理功能

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一张思维导图带你学会SpringBoot使用AOP实现日志管理功能

思维导图



🌟AOP介绍


基本概念:在不改变原有功能的逻辑,增加新的功能。

应用场景

  • 权限控制
  • 日志处理
  • 事务控制


下面以对产品数据增删改查功能,进行日志管理功能为例,对AOP中的核心概念作出介绍,请参考下表

概念 解析 对应日志管理功能
核心关注点 业务逻辑的主要功能,应用程序主要关注的部分 产品数据的增删改查
横切关注点 与核心关注点相关但不属于核心关注点的功能,在系统的多个模块或组件中散布 记录产品操作的日志
通知 在特定切入点执行时要执行的代码,实现横切关注点的具体逻辑。可以在目标方法执行之前、之后或抛出异常时执行 执行记录日志的代码
连接点 可以插入通知的特定点,通常是方法执行的位置 产品表操作的方法
切入点 通过表达式或规则定义的连接点的集合。确定了哪些连接点与通知关联起来 选择所有的插入、更新或删除操作的连接点集合
切面 横切关注点和通知的组合,将通知应用到切入点匹配的连接点上 包含记录日志的通知和定义切入点的规则
目标 被通知的对象或类,即应用程序中执行具体操作的对象或方法 对产品数据作出操作的对象或方法
织入 将切面应用到目标对象上,创建新的代理对象的过程。可以在编译时、加载时或运行时进行 将日志管理切面应用到产品表操作的目标对象上,以记录日志


🌟具体实现步骤


数据准备


创建产品表、以及日志表,并向产品表添加相关数据。

CREATE TABLE `product`  (
  `id` int(11) NOT NULL,
  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `price` decimal(10, 2) NULL DEFAULT NULL,
  `stock` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
-- ----------------------------
-- Records of product
-- ----------------------------
INSERT INTO `product` VALUES (1, '苹果13', 10.99, 50);
INSERT INTO `product` VALUES (2, '小米10', 19.99, 99);
INSERT INTO `product` VALUES (3, '华为mate20', 5.99, 19);
CREATE TABLE `log`  (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `operation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `data` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `operate_time` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;


引入相关依赖


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>


创建实体类


Product类

public class Product implements Serializable {
    private Integer id;
    private String name;
    private BigDecimal price;
    private Integer stock;
}


Log类

public class Log implements Serializable {
    private Integer id;
    private String operation;
    private String data;
    private Timestamp operateTime;
}


自定义注解@LogTip


自定义注解,用于标记记录日志的方法。

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogTip {
    String value() default "";
}


定义切面类


切面类由切点PointCut+通知Advice共同构成。有关于通知的类型以及解释,可以查看思维导图中的通知节点。有关于JoinPoint的API见下表

API 描述
getSignature() 获取连接点的签名,返回一个MethodSignature对象
getArgs() 获取连接点方法的参数数组
getTarget() 获取目标对象
getThis() 获取当前代理对象
toShortString() 生成连接点的简短描述
toLongString() 生成连接点的详细描述
getStaticPart() 获取静态连接点部分
getKind() 获取连接点的类型
getSourceLocation() 获取连接点所在位置的源代码位置
@Component
@Aspect
public class LogAspect {
    @Autowired
    private LogMapper logMapper;
    @Pointcut("@annotation(com.shoanjen.redis.annotation.LogTip)")
    public void pointCut(){}
    @AfterReturning("pointCut()")
    public void getLogInfo(JoinPoint point) throws Throwable {
        // 获取方法参数列表
        Object[] args = point.getArgs();
        //获取自定义注解上的描述信息
        MethodSignature methodSignature= (MethodSignature) point.getSignature();
        Method method=methodSignature.getMethod();
        LogTip annotation=method.getAnnotation(LogTip.class);
        String desc=annotation.value();
        // 获取操作的数据
        String data = Arrays.toString(args);
        // 记录日志
        saveLog(desc, data);
    }
    private void saveLog(String desc, String data) {
        Log log = new Log();
        log.setOperation(desc);
        log.setData(data);
        log.setOperateTime(new Timestamp(System.currentTimeMillis()));
        logMapper.save(log);
    }
}


LogMapper


public interface LogMapper {
    void save(Log log);
}


<insert id="save" parameterType="com.shoanjen.redis.model.Log" keyColumn="id" keyProperty="id" useGeneratedKeys="true">
       INSERT INTO log(operation, data, operate_time) VALUES (#{operation}, #{data}, #{operateTime});
</insert>


ProductController


这里以上一篇文章一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存中的产品下单功能为例子,对其记录日志。

@RestController
@RequestMapping("/api/v1/product")
public class ProductController {
    @Autowired
    private ProductService productService;
    @Autowired
    private ValidateTask validateTask;
    @LogTip("产品下单")
    @RequestMapping("order")
    public JsonData order(@RequestParam int productId,@RequestParam int quantity) throws ExecutionException, InterruptedException {
        Future<Boolean> validateResult=validateTask.validateStock(productId,quantity);
        System.out.println(validateResult.get());
        Boolean flag=false;
        //判断异步任务是否完成
        if (validateResult.isDone()){
            try {
                flag=validateResult.get();
            } catch (Exception e) {
                flag=false;
            }
        }
        if (flag){
            return JsonData.buildSuccess("下单成功");
        }else {
            return JsonData.buildError("下单失败,库存不足");
        }
    }
}


🌟最终测试


接口请求测试



1f9be352187d98f22c0c1953738d75f4_2caece314df04a99988a8b95ca699739.png


日志表查看



🌟写在最后


有关于SpringBoot使用AOP实现日志管理功能到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
104 5
|
2月前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
70 0
|
2天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
26 8
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
78 5
|
2月前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
52 3
|
2月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
150 8
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
133 2
|
2月前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
58 1
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
535 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
28天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
下一篇
开通oss服务