V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
changdy
V2EX  ›  Java

各位 V 友们 , 你们创建 Spring Boot 项目之后会做那些初始化工作?

  •  1
     
  •   changdy · 2023-12-07 21:53:53 +08:00 · 7426 次点击
    这是一个创建于 380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    和各位大佬交流下 .如果你们新建一个项目 会做那些初始化工作 . 我先说我的吧.

    1. 做好 mdc 上下文以及自定义日志配置.
    2. 异步线程池&定时任务设置好配置
    3. 自定义异常&异常处理器
    4. json 序列化配置 , long 类型转 string
    5. 引入 CommonsRequestLoggingFilter 打印请求,非常好用推荐
    6. 针对 dubbo 的话可以进行一个 filter 打印请求和返回情况
    7. 如果 mysql 上有死锁 , 考虑加个自定义的事务监听, 统计事务耗时 ,加 mybatis sql 拦截器 ,手动加个 mdc,方便根据 sql 中的 mdc 查找到代码的上下文.
    61 条回复    2024-07-13 12:01:42 +08:00
    dreamlike
        1
    dreamlike  
       2023-12-07 22:17:34 +08:00 via Android
    👀我理解如果每个新 sb 项目都要这一套的话 是不是有个抽一个 starter 来自动配置呢?
    potatowish
        2
    potatowish  
       2023-12-07 22:24:34 +08:00 via iPhone   ❤️ 2
    1. Logback 日志配置
    2. OkHttp3 Client 及日志拦截器配置
    3. CommonsRequestLoggingFilter 打印请求日志
    4. Jackson ObjectMapper 自定义配置
    5. Redisson 、Jedis Client 配置
    6. 自定义异常、全局异常处理
    wxw752
        3
    wxw752  
       2023-12-07 23:00:47 +08:00
    把之前配好的脚手架 CV 一份到新目录,然后打开...
    qianzanqi
        4
    qianzanqi  
       2023-12-07 23:37:37 +08:00
    这些不都是应该由公司的基础组件团队提供吗,自动装配的 starter 只要引入就行了
    changdy
        5
    changdy  
    OP
       2023-12-08 01:26:40 +08:00
    @qianzanqi 但是公司的也不一定是完整的,所以我想多收集一下.

    @wxw752

    @dreamlike 大佬下能分享下你们掌握的吗?



    其他 V 友 们.. 不要光顾着收藏啊. 可以一起分享呗.互相交流下
    finalsatan
        6
    finalsatan  
       2023-12-08 08:48:14 +08:00
    半路出家的 java ,现在都是用同事搭建好的脚手架,学习学习各位大佬
    cnzjl
        7
    cnzjl  
       2023-12-08 09:18:15 +08:00
    学到了,这就看下 CommonsRequestLoggingFilter
    anakinsky
        8
    anakinsky  
       2023-12-08 09:39:08 +08:00
    CommonsRequestLoggingFilter 是要自己实现的吗,我用的这个 logbook 感觉还不错
    https://github.com/zalando/logbook
    JerryYuan
        9
    JerryYuan  
       2023-12-08 09:39:13 +08:00 via Android   ❤️ 9
    当然是先创建一个 banner.txt 啦(doge
    chendy
        10
    chendy  
       2023-12-08 09:46:15 +08:00
    复制粘贴上一个项目,然后把业务代码抠掉然后 git init
    写了小十年 java 才知道 CommonsRequestLoggingFilter ,以为是啥新东西,一看 since 1.2.5 ,看来还是学艺不精啊
    mmdsun
        11
    mmdsun  
       2023-12-08 09:50:55 +08:00
    切面统计方法耗时、日志文件格式做一些自定义
    FawkesV
        12
    FawkesV  
       2023-12-08 10:03:04 +08:00
    第一次知道这个 CommonsRequestLoggingFilter 学习了.
    edotac
        13
    edotac  
       2023-12-08 10:43:35 +08:00
    其实就是每个项目的公共配置呗,提一个

    LOGBACK 配置标准输出日志的颜色以及长度限制,方便在容器查看
    changdy
        14
    changdy  
    OP
       2023-12-08 11:17:10 +08:00
    @anakinsky 非常简单.就配置下几个参数就好了. 好处是 spring boot 自带.完全兼容.

    你这个也不错.能够打印返回信息.
    changdy
        15
    changdy  
    OP
       2023-12-08 11:19:58 +08:00
    @cnzjl
    @chendy
    @FawkesV 哈哈 楼上也有一个其他工具 .不过我这个是 spring boot 自带的.更方便一些 .按需选择

    各位朋友也可以互相交流学习下. 说不定也有好用的工具
    looveh
        16
    looveh  
       2023-12-08 11:30:25 +08:00
    @chendy 我也是第一次知道,以前都是用 aop 做的😂
    cp19890714
        17
    cp19890714  
       2023-12-08 11:31:16 +08:00
    只需要依赖自己写的 base-pom 和 common 就完事了, common 包含以下模块.
    common-core 用于任意 java 项目的依赖.
    common-spring 用于 spring 项目的依赖
    common-mvc 用于 spring-mvc 项目的依赖.
    common-webflux 用于 webflux 项目的依赖
    common-micro-service 任何 springcloud 项目可以依赖.
    common-config 任何 springboot 项目可以依赖, 主要使用的通常配置项 和 配置文件都在里面了. 例如 log4j2 配置文件.
    whoami9426
        18
    whoami9426  
       2023-12-08 11:59:16 +08:00   ❤️ 1
    分环境打印接口出入参,耗时
    MDC 添加操作人信息
    分环境打印 SQL 执行语句,耗时
    未捕获异常结合 git blame @提交人 告警到钉钉群处理
    bill110100
        19
    bill110100  
       2023-12-08 12:17:20 +08:00
    第一次知道 CommonsRequestLoggingFilter 打印请求 ,我之前都是配置 springboot 的配置项 spring:mvc:
    log-request-details: true ,打印 org .springframwork.web 下的 trace 级别日志就能自动把请求和返回的信息全序列化到日志里
    siweipancc
        20
    siweipancc  
       2023-12-08 13:26:05 +08:00 via iPhone   ❤️ 2
    给用 log 过滤器的提个醒,小心文件流
    Martin9
        21
    Martin9  
       2023-12-08 14:06:23 +08:00
    CommonsRequestLoggingFilter 好像不能记录 response ,有啥能 request ,response 一起记的么
    potatowish
        22
    potatowish  
       2023-12-08 14:08:28 +08:00 via iPhone
    @siweipancc setIncludePayload to false, or try setMaxPlayloadLength
    dif
        23
    dif  
       2023-12-08 14:11:36 +08:00   ❤️ 1
    只有我一个人先改 banner 吗? 手动狗头
    DdDddDlush
        24
    DdDddDlush  
       2023-12-08 14:33:12 +08:00
    想白嫖一个脚手架
    changdy
        25
    changdy  
    OP
       2023-12-08 15:17:34 +08:00
    @DdDddDlush 哈哈 我也是像白嫖一个..看能有那些进行设置的.
    zhenjiachen
        26
    zhenjiachen  
       2023-12-08 15:36:11 +08:00
    我也第一次知道 CommonsRequestLoggingFilter ,学到了
    xuanbg
        27
    xuanbg  
       2023-12-08 15:53:02 +08:00
    打开旧项目,复制 application.yml 和 common 目录到新项目
    imkku
        28
    imkku  
       2023-12-08 16:00:52 +08:00
    SnowHall
        29
    SnowHall  
       2023-12-08 16:12:15 +08:00   ❤️ 1
    @DdDddDlush 推荐 ruoyi-vue-plus 。
    nullable
        30
    nullable  
       2023-12-08 16:25:21 +08:00
    公司我都已经封装成一个个 starter 了,比如 xxx-cloud-web-starter 封装了:MDC 配置、统一日志、ObjectMapper ( long 转 string 、java.time API 、not null )、LoggingRequest (忽略 file ,LoggingResposne (打印部分)、自定义异常、全局异常处理、Redisson 、Nacos 。
    其它的也基本上封装了,比如 mybatis 统一路径,扩展 Mapper 、xxljob 自动装配等、简化 application 的配置(约定)
    LiaoMatt
        31
    LiaoMatt  
       2023-12-08 16:31:59 +08:00
    没用过 CommonsRequestLoggingFilter, 但是我现在检查方法入参出参都用 arthas
    LiaoMatt
        32
    LiaoMatt  
       2023-12-08 16:37:16 +08:00
    没用过 CommonsRequestLoggingFilter, 但是我现在检查方法入参出参都用 arthas 实时看
    changdy
        33
    changdy  
    OP
       2023-12-08 16:50:47 +08:00
    @LiaoMatt 卧槽 大兄弟你这有点懵猛啊. 不过主要是不同的工具 .arthas 只能看最后转换的实体类 但是 filter 是为了看原始的数据 .
    LiaoMatt
        34
    LiaoMatt  
       2023-12-08 16:52:19 +08:00
    @changdy 原始数据,如果不是 https, 我之前都是用 wireshark 看- -
    Greendays
        35
    Greendays  
       2023-12-08 16:53:16 +08:00
    建完项目后一脸懵逼,点开以前的项目参考目录结构。。。
    litchinn
        36
    litchinn  
       2023-12-08 17:15:23 +08:00
    配置日志,配置数据库,配置 security ,配置 jackson ,配置 redis ,写个 Dockerfile ,引入一些 spring initializr 中没有的包

    如果能自己改造下 spring initializr 或者用模板引擎搞一个生成器,那么可以啥也不做
    Bingchunmoli
        37
    Bingchunmoli  
       2023-12-08 17:37:54 +08:00 via Android
    尝试做了点,但是还是比直接写有点难的。https://github.com/BingChunMoLi/quick
    mgzu
        38
    mgzu  
       2023-12-08 18:17:10 +08:00
    @Bingchunmoli 没有单测和集成测试诶
    Bingchunmoli
        39
    Bingchunmoli  
       2023-12-08 18:32:02 +08:00 via Android
    @mgzu 公司没有做测试的经验,只能自己摸索着写,https://github.com/bingchunmoli/moliapi. 这个写了但是出现了一些问题,影响打包了,
    youngPacce
        40
    youngPacce  
       2023-12-08 19:48:45 +08:00 via Android
    long 转 string 是为啥?
    oneisall8955
        41
    oneisall8955  
       2023-12-08 20:06:21 +08:00 via Android
    @358343917 精度问题,前端 19 位后面全是 0
    mgzu
        42
    mgzu  
       2023-12-08 20:25:54 +08:00   ❤️ 1
    @Bingchunmoli 我是看 spring boot commit 来学习 unit test 写法。单测和 ci cd 对框架来说更重要,比如升级依赖版本后,框架层的设计可能就不能按预期工作
    Bingchunmoli
        43
    Bingchunmoli  
       2023-12-08 22:48:55 +08:00 via Android
    @mgzu 可能更多情况是有其他人用非自己用能遇到问题或者角度或许才能考虑到一些事情和一些动力来源,
    sunny2580839896
        44
    sunny2580839896  
       2023-12-09 07:38:49 +08:00 via Android
    我用若依,你说什么我不知道
    changdy
        45
    changdy  
    OP
       2023-12-09 22:41:41 +08:00
    @sunny2580839896 哈哈 本来我是想让大家讨论下 众人拾柴. 不过可能大家都比较害羞.
    dongci777
        46
    dongci777  
       2023-12-10 02:43:06 +08:00
    学会写 starter ,然后把项目经常使用的操作封装成一个 starter 放在自己的私服下面,然后直接每次项目引入就好了,像你这样不得每次累死,而且还容易漏
    fjdingsd
        47
    fjdingsd  
       2023-12-10 08:42:33 +08:00
    我好奇,大家会滥用 @PostConstruct 注解吗?
    changdy
        48
    changdy  
    OP
       2023-12-10 09:40:47 +08:00
    @dongci777 所以现在不是正在搜集那些能加入 starter 啊..大佬一起分享下呗.
    changdy
        49
    changdy  
    OP
       2023-12-10 09:41:23 +08:00
    @fjdingsd 什么算滥用 2333 . 不是都是用到了采用.
    jaylee4869
        50
    jaylee4869  
       2023-12-10 12:39:59 +08:00
    swagger openapi
    actuator endpoint
    cxk0
        51
    cxk0  
       2023-12-10 16:18:04 +08:00
    这个帖子早该出来了~ 太帅了!逐条拜读,并做记录。 谢谢各位大佬!
    DdDddDlush
        52
    DdDddDlush  
       2023-12-11 12:58:10 +08:00
    @SnowHall 先感谢回复。作为脚手架个人感觉比较重。也可能是我自己水平不行不太会剥离,想要一点更轻量的。
    simanW
        53
    simanW  
       2023-12-13 01:02:36 +08:00
    楼主能提供个 demo 吗?感觉你这个初始化工作看着挺不错的
    changdy
        54
    changdy  
    OP
       2023-12-15 00:26:15 +08:00
    @simanW 我周末整理一下吧...同时我也在知乎 问问 ..然后也去掘金尝试抛砖引玉 .看看有没有人一起完善这种比较使用的方法/类/配置
    ccmjga
        55
    ccmjga  
       2023-12-18 21:41:31 +08:00
    https://www.v2ex.com/t/1001297#reply2
    如果可以接受这个技术栈的话,可以上面这个脚手架。大家关心的测试、代码质量、工程结构等在脚手架中都有体现。
    一些做法大家也可参考这个脚手架的实现。

    @wxw752
    @potatowish
    @changdy
    @finalsatan
    @DdDddDlush
    @mgzu
    @Bingchunmoli
    @mgzu
    @fjdingsd
    @simanW
    RotJun
        56
    RotJun  
       355 天前
    @anakinsky #8 大佬,logbook 咋用的呀
    anakinsky
        57
    anakinsky  
       354 天前
    @RotJun 依赖加进去就行啦,配置按需

    ```
    <dependency>
    <groupId>org.zalando</groupId>
    <artifactId>logbook-spring-boot-starter</artifactId>
    <version>${logbook.version}</version>
    </dependency>
    ```
    RotJun
        58
    RotJun  
       353 天前
    @anakinsky #57 需要写配置类嘛
    anakinsky
        59
    anakinsky  
       353 天前
    @RotJun 不需要
    liuqitoday
        60
    liuqitoday  
       338 天前
    @changdy #54 楼主整理好了么 希望学习以下
    shiloh595
        61
    shiloh595  
       162 天前
    学习一下👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2471 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:06 · PVG 13:06 · LAX 21:06 · JFK 00:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.