热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用springboot重构一个五年前的项目是什么体验?(一)

文章目录前言为什么要重构?1.原先spring架构可维护性越来越低2.集成新技术的成本变高3.各种不同环境的问题依然时不时的会存在4.重构过程能对更多的技术细节进行深

文章目录

  • 前言
    • 为什么要重构?
      • 1. 原先spring架构可维护性越来越低
      • 2. 集成新技术的成本变高
      • 3. 各种不同环境的问题依然时不时的会存在
      • 4. 重构过程能对更多的技术细节进行深入学习
    • 重构清单
      • 项目结构重构
      • 配置文件从原先的xml到完全properties
      • 各类jar包从单独到结成starter方式的重构
      • 单元测试保证重构后的系统功能
    • (一)项目结构重构
    • 小结




前言

最近把一个从2015年开发至今的一个个人项目从传统的spring彻底重构成springboot项目,用了大概一个多月的时间,里面的坑还是挺多的,但是收获也是满满,记录一下,希望能帮助那些准备或者在做这一步的朋友(有任何问题都可以私信我,非常乐意解答)。

为什么要重构?


1. 原先spring架构可维护性越来越低


  • 刚开始xml+配置文件的方式感觉没什么,但是随着各种参数、动态配置的增加xml中引用properties中的变量使得开发人员维护变得越来越复杂(我一个人维护有时候都找半天), 而springboot的约定大于配置理念使配置基本框架配置变得清晰易维护
  • springboot查问题更加简单:由于配置都非常固定,区别原先spring方式各种不同的配置,亲测出错概率大大降低,极大提升了维护性。
  • 由于原生spring,得自己管理各种jar包,所以会出现各种jar包冲突等一些列的问题,这大大降低了维护性, 而springboot则有对应开发的starter,各种版本都做到了统一,出错概率也大大降低。

2. 集成新技术的成本变高


  • 由于springcloud的发展,springboot变成了一个基础的架构,而如果还是沿用原来的spring xml配置的方式文档和资料变的越来越少,机会成本也变大了。反观springboot资料变得越来越丰富集成一个新的框架或者替换都是分分钟的事情

3. 各种不同环境的问题依然时不时的会存在


  • 由于原先spring的方式,或多或少都会依赖外部的容器去做启动,虽然刚开始可能没什么问题,但是随着各种依赖以及开发和测试环境的不同,偶尔会出现本地测试好好的,而一发布到测试就会有各种问题,而springboot内嵌容器就非常好的解决了这个问题,容器被打包在了发布jar中,隔离了不同环境因素,使得发布出现问题的概率大大降低

4. 重构过程能对更多的技术细节进行深入学习


  • 重构能迫使自己对原先的代码细节重新梳理,思考原先架构的合理性
  • 重构过程会对各种第三方依赖做梳理,能够更好的了解细节
  • 重构的过程遇到了很多的问题,解决的过程恰恰是宝贵的财富

重构清单


  • 项目结构重构

  • 配置文件从原先的xml到完全properties

  • 各类jar包从单独到结成starter方式的重构

  • 单元测试保证重构后的系统功能


(一)项目结构重构

从spring到springboot由于“ 约定大于配置”的理念简化了很多配置,项目的分层结构也可以做一次重构,不需要沿用原来spring的方式,做到更加简单和清晰。
原来的结构目录:
在这里插入图片描述
结构大致是 biz作为基础的公用组件, web为前端,采用springmvc(虽然现在流行前后端分离架构,但是独立开发也还ok,后期准备拆分)、 schedule为定时任务、还有back和service 分别是后台管理和对外微服务这两个就不详细展开。

web模块依赖biz模块,而本身里面又分为base、home、war,项目的结构比较的复杂(主要是原来公司的一个规范),这里主要改造的点:

  • springboot mvc项目不需要打包成war,所以直接干掉war模块
  • 保留home模块(各种Controller),base作为打包模块也保留

改造完成后结构:在这里插入图片描述
改造完成以后可以看出只有core模块和package打包模块,比较清晰,很多刚接触maven的小伙伴会疑问为什么要单独package模块做打包用,不是可以直接打包吗,这里正好提一下,也是这次重构的收获:
如果是单独模块的maven项目,其实没什么难度,都只有一个pom打包成jar只需要

<packaging>jarpackaging>

就可以打包&#xff0c;但是如果项目有公共模块&#xff0c;需要聚合别模块这样maven的项目结构就会变得稍微复杂一点&#xff1a;
在这里插入图片描述

这里的package模块只做部分聚合用&#xff0c;这里就是聚合了公用biz和web模块&#xff1a;&#xff08;如果对maven多模块感兴趣的朋友后面我会考虑单独出一篇&#xff09;&#xff0c;而原先war模块存在的原因就是要打包成war&#xff0c;不过springboot打成jar会更方便所以直接取消了war模块变得更加简单&#xff0c;对于新上手的程序员会更加友好。

小结

这篇主要大致梳理了原先spring老项目为什么重构&#xff0c;和如何开始重构&#xff0c;重构的过程虽然很多坑很苦但是收获还是很大的&#xff0c;后面的文章会沿着重构清单继续下去&#xff0c;有任何问题都可以留言或者私信我&#xff0c;我会认真回答~~


推荐阅读
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
author-avatar
qqjayzhe
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有