SpringBoot自定义starter之接口日志输出

news2024/12/20 16:26:55

文章目录

  • 前言
  • 文章主体
    • 1 项目全部源码
    • 2 项目结构介绍
    • 3 starter 的使用
      • 3.1 配置文件 application,yml的内容
      • 3.2 启动类
      • 3.3 控制器类
    • 4 测试结果
  • 结语

前言

本文灵感来源是一道面试题。
要求做一个可以复用的接口日志输出工具,在使用时引入依赖,即可使用。
可能用在多个项目中。

问题处理思路是,自定义一个SpringBoot的Starter,可以加入一些功能配置。核心使用自定义注解、Aspect切面来做。
用切面去切你的自定义注解即可。那么下面内容就做一下具体实现。

自定义starter可以参考文章:https://blog.csdn.net/FBB360JAVA/article/details/128847565

PS:本文使用的环境是 SpringBoot 的 2.7.12版本,Java openjdk11,构建工具使用了 Maven。

文章主体

1 项目全部源码

代码仓库:
https://gitee.com/fengsoshuai/custom-log.git

2 项目结构介绍

在这里插入图片描述

上图中的红色框内容,是自定义的starter模块。
包结构中,annotation 是自定义的注解,aop是切面,config是自动配置类,entity是实体类。

3 starter 的使用

在模块 custom-log-starter-test 模块中进行测试使用。
在这里插入图片描述

3.1 配置文件 application,yml的内容

org:
  feng:
    enableCustomLog: true

server:
  port: 8080

3.2 启动类

package org.feng;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@EnableAspectJAutoProxy(exposeProxy = true)
@SpringBootApplication
public class CustomLogStarterTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(CustomLogStarterTestApplication.class, args);
    }
}

3.3 控制器类

在接口的方法上,增加注解 CustomLog

package org.feng.controller;

import org.feng.customlog.annotation.CustomLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * 测试控制器
 *
 * @version v1.0
 * @author: fengjinsong
 * @date: 2023年06月05日 17时09分
 */
@RestController
public class CustomLogController {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomLogController.class);

    @CustomLog
    @PostMapping("/hello/{param}")
    public String hello(@PathVariable("param") String param) {
        LOGGER.info("正在执行接口 CustomLogController#hello({})", param);
        String uuid = UUID.randomUUID().toString();
        return uuid + param;
    }
}

4 测试结果

POST 请求 http://localhost:8080/hello/112233a
输出的日志是:

2023-06-05 17:21:57.381  INFO 16620 --- [nio-8080-exec-1] org.feng.customlog.aop.CustomLogAspect   : hello 的请求参数是:[112233a]
2023-06-05 17:21:57.387  INFO 16620 --- [nio-8080-exec-1] org.feng.controller.CustomLogController  : 正在执行接口 CustomLogController#hello(112233a)
2023-06-05 17:21:57.388  INFO 16620 --- [nio-8080-exec-1] org.feng.customlog.aop.CustomLogAspect   : hello 执行的结果是:7d4b185c-5e5d-4e64-8818-54ef77651561112233a

如果配置进行修改:

org:
  feng:
    enableCustomLog: false

enableCustomLog 改为false,或直接删除该配置,是不会启动日志输出的。(这里就不贴测试结果了)

结语

全部代码可以在gitte中下载查看。
代码仓库:https://gitee.com/fengsoshuai/custom-log.git

有其他思路的同学也可以在评论区留言讨论,我们共同学习,一起进步吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库 10.DCL操作

目录 🤔 前言: 🤔DCL介绍: 🤔1.DCL管理用户: 1.查询用户: 图示: 2.创建用户 示例1: 运行结果:​ 示例2: 运行结果:​ 3.修改…

算法修炼之筑基篇——筑基一层中期(解决01背包,完全背包,多重背包)

✨博主:命运之光​​​​​​ 🦄专栏:算法修炼之练气篇​​​​​ 🍓专栏:算法修炼之筑基篇 ✨博主的其他文章:点击进入博主的主页​​​​​​ 前言:学习了算法修炼之练气篇想必各位蒟蒻们的基…

安全——网络安全协议的引入

TCP/IP安全缺陷 信息泄露 概述 网络中投递的报文往往包含账号、口令等敏感信息,若这些信息泄露则是灾难性的后果。其中嗅探是一种常见而隐蔽的网络攻击手段。 嗅探 概述 问题:在共享式网络架构下,所有的数据都是以广播方式进行发送&…

程序员大专毕业,月薪2w是什么体验?

在这个数据驱动的时代,大数据行业的发展前景也非常广阔,我相信我的未来会越来越光明 01 开始学习 是迈向前方的第一步 我是三月,一个来自小城市的大专毕业生。现在在杭州一家公司做大数据开发工程师,目前薪资是20k*13。 我本身…

运维小白必学篇之基础篇第十三集:网络概述中继实验

网络概述中继实验 实验作业(主机名为自己的名字): 1、搭建中继环境,要求如下: 网络要求: 内网:192.168.50.50 网关:192.168.50.254 192.168.60.254 外网:192.168.60.60 主…

【论文阅读】An Object SLAM Framework for Association, Mapping, and High-Level Tasks

一、系统概述 这篇文章是一个十分完整的物体级SLAM框架,偏重于建图及高层应用,在前端的部分使用了ORBSLAM作为基础框架,用于提供点云以及相机的位姿,需要注意的是,这篇文章使用的是相机,虽然用的是点云这个…

DevOps该怎么做?

年初在家待了一段时间看了两本书收获还是挺多的. 这些年一直忙于项目, 经历了软件项目的每个阶段, 多多少少知道每个阶段是个什么, 会做哪些事情浮于表面, 没有深入去思考每个阶段背后的理论基础, 最佳实践和落地工具. 某天leader说你书看完了, 只有笔记没有总结, 你就写个总结…

小白必看!轻松理解和解决MySQL幻读问题!

大家好,我是小米!今天我来给大家分享一下关于MySQL数据库中常见的一个问题——幻读,以及如何解决它。相信对于数据库开发和管理的小伙伴们来说,幻读是一个相对棘手的问题,但只要我们掌握了正确的解决方法,它…

网络故障管理

网络故障管理是以最快的方式查找、隔离和排除网络故障的过程。故障管理是网络管理的重要组成部分,它通过快速解决故障来最大限度地减少停机时间并防止设备故障,从而确保最佳的网络可用性并防止业务损失。 网络故障监控是故障管理的第一步,因…

Linux Shell脚本攻略

一、echo命令 1、在echo中转义换行符 默认情况下,echo会在输出文本的尾部追加一个换行符。可以使用选项-n来禁止这种行为。 echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时,需要使用echo -e "包含转义序列的字符串"这…

有哪些测试框架和工具推荐? - 易智编译EaseEditing

在软件测试领域,有许多测试框架和工具可供选择。以下是一些常见的测试框架和工具的推荐: Selenium: 一个用于自动化Web应用程序测试的流行框架。它支持多种编程语言,并提供丰富的功能和灵活性。 JUnit: 一个用于Java应用程序的单元测试框架…

MongoDB(学习笔记1.0)

最近在学非关系型数据库MongoDB,猛地用起来的真的没关系型数据库方便啊。 首先还是数据库的安装: 安装直接去官网安装即可,官网地址:MongoDB: The Developer Data Platform | MongoDB 当前也有免安装版的,这里就不再…

毕业三年,自学软件测试到就业,我用了4个月

我转行的经历 17年毕业,普通专科,通信专业。 当初选择这个专业是因为有一个校企合作,承诺学生毕业之后给学生安排就业,在学校里面混了三年之后,学校也是履行了当初安排就业的承诺,给我“发配”到了上海&a…

chatgpt赋能python:Python同一行输入

Python同一行输入 在Python编程中,你可能需要在同一行中输入多个命令或语句。这可以通过使用分号来实现。 在本文中,我们将介绍如何在Python中使用同一行输入,并探讨其优缺点。 使用分号实现同一行输入 在Python中,分号&#x…

地震勘探基础(九)之地震速度分析

速度分析 在地震资料数字处理中,速度分析是动校正和水平叠加和地震偏移的基础。 在水平界面情况下,共中心点时距曲线方程是一条双曲线。在共中心点时距曲线中,炮检距 x x x 和时间 t 0 t_0 t0​ 都是已知的,只有速度 v v v 是…

30天从入门到精通TensorFlow1.x 第五天,跨计算设备执行计算图-cpu

一、接前一天 前天学习了,数据流图,今天尝试在不同设备上(cpu或者gpu)来执行计算图。 本次使用cpu来执行,但是不涉及gpu。gpu放在后面学习,这里比较重要。 二、示例 1. 先看看自己的设备 from tensorfl…

My Note of Diffusion Models

Diffusion Models Links: https://theaisummer.com/diffusion-models/ Markovian Hierachical VAE rvs: data: x 0 x_{0} x0​,representation: x T x_{T} xT​ ( p ( x 0 , x 1 , ⋯ , x T ) , q ( x 1 , ⋯ , x T ∣ x 0 ) ) (p(x_0,x_1,\cdots,x_T),q(x_1,\cdots,x_{T…

AcWing 回转游戏 dfs IDA* 剪枝 统一操作 java

🍑 算法题解专栏 🍑 回转游戏 如下图所示,有一个 # 形的棋盘,上面有 1 , 2 , 3 1,2,3 1,2,3 三种数字各 8 8 8 个。 给定 8 8 8 种操作,分别为图中的 A s i m H A \\sim H AsimH。 这些操作会按照图中字母和箭头…

ChatGPT会取代低代码开发平台吗?

编程作为一种高端技能,向来是高收入高科技的代名词。近期,伴随着ChatGPT在全球的爆火,过去通过窗口“拖拉拽”的所见即所得方式的低代码开发模式,在更加智能和更低成本的AI搅局之下,又面临了更深层次的影响。 低代码平…

MySQL redo log、undo log、binlog

MySQL是一个广泛使用的关系型数据库管理系统,它通过一系列的日志来保证数据的一致性和持久性。在MySQL中,有三个重要的日志组件,它们分别是redo log(重做日志)、undo log(回滚日志)和binlog&…