Java 老项目从 SSM 迁移 Spring Boot 实战记录 前言最近接手了一个跑了五六年的老项目SSMSpring Spring MVC MyBatis架构XML 配置堆成山启动要等两分钟每次加个需求都要折腾半天。老板说能不能给它升级一下于是花了两周时间把这个老古董从 SSM 搬到了 Spring Boot 3.x。记录一下踩过的坑和实战经验希望对你有帮助。一、迁移前的老项目长什么样典型的 SSM 项目结构src/ ├── main/ │ ├── java/ │ │ └── com/xxx/ │ │ ├── controller/ │ │ ├── service/ │ │ ├── dao/ │ │ └── entity/ │ └── resources/ │ ├── spring/ │ │ ├── spring-context.xml │ │ ├── spring-mvc.xml │ │ └── spring-mybatis.xml │ ├── mybatis/ │ │ └── mapper/ │ ├── jdbc.properties │ └── log4j.properties └── webapp/ └── WEB-INF/ └── web.xml痛点很明显XML 配置文件 5 个起步互相引用改一个漏一个依赖版本全靠手动维护jar 包冲突是家常便饭没有内嵌 Tomcat开发调试依赖外部容器包扫描、拦截器、视图解析器全部手配二、迁移的核心思路迁移不是重写不要动业务逻辑。我的原则是只改框架层不改业务代码整体步骤1. 新建 Spring Boot 项目 2. 逐层替换配置文件 3. 复制业务代码Service/Controller/Mapper 4. 改造 MyBatis 配置 5. 测试验证三、具体实施过程3.1 新建 Spring Boot 项目用 Spring Initializr 生成选择依赖dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.3/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.20/version/dependency/dependencies新项目结构src/main/java/com/xxx/ ├── controller/ ├── service/ ├── mapper/ ├── entity/ └── XxxApplication.java3.2 配置文件迁移SSM 时期— 一堆 XML!-- spring-mybatis.xml --beaniddataSourceclasscom.alibaba.druid.pool.DruidDataSourcepropertynamedriverClassNamevalue${jdbc.driver}/propertynameurlvalue${jdbc.url}/propertynameusernamevalue${jdbc.username}/propertynamepasswordvalue${jdbc.password}//beanbeanclassorg.mybatis.spring.SqlSessionFactoryBeanpropertynamedataSourcerefdataSource/propertynamemapperLocationsvalueclasspath:mybatis/mapper/*.xml//beanbeanclassorg.mybatis.spring.mapper.MapperScannerConfigurerpropertynamebasePackagevaluecom.xxx.dao//beanSpring Boot 时期— application.yml 搞定一切spring:datasource:url:jdbc:mysql://localhost:3306/xxx?useUnicodetruecharacterEncodingutf-8username:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Drivertype:com.alibaba.druid.pool.DruidDataSourcemybatis:mapper-locations:classpath:mapper/*.xmltype-aliases-package:com.xxx.entityconfiguration:map-underscore-to-camel-case:truelog-impl:org.apache.ibatis.logging.stdout.StdOutImpl以前 50 行的 XML现在 15 行配置搞定。3.3 web.xml 替换SSM 的 web.xmlservletservlet-namedispatcher/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring/spring-mvc.xml/param-value/init-param/servletfilterfilter-nameencoding/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param/filterSpring Boot 里直接加一个配置类替代ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newLoginInterceptor()).addPathPatterns(/**).excludePathPatterns(/login,/css/**,/js/**);}BeanpublicFiltercharacterEncodingFilter(){CharacterEncodingFilterfilternewCharacterEncodingFilter();filter.setEncoding(UTF-8);filter.setForceEncoding(true);returnfilter;}}3.4 最坑的地方 — MyBatis 兼容问题坑 1MyBatis 3.5 废弃了useGeneratedKeys的默认行为老项目 Mapper 里如果用了selectKey需要显式声明insertidinsertuseGeneratedKeystruekeyPropertyidINSERT INTO user(name) VALUES(#{name})/insert坑 2日期类型处理老项目用的java.util.DateSpring Boot 3.x 默认走java.time系列。加一个配置解决spring:jackson:date-format:yyyy-MM-dd HH:mm:sstime-zone:Asia/Shanghai坑 3分页插件版本不兼容老项目 PageHelper 4.x → 升级到 PageHelper 6.xdependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper-spring-boot-starter/artifactIdversion2.1.0/version/dependencypagehelper:helper-dialect:mysqlreasonable:true3.5 日志配置迁移SSM 时期log4j.rootLoggerINFO, Console log4j.appender.Consoleorg.apache.log4j.ConsoleAppender log4j.appender.Console.layoutorg.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %m%nSpring Boot 时期logback-spring.xml?xml version1.0 encodingUTF-8?configurationappendernameCONSOLEclassch.qos.logback.core.ConsoleAppenderencoderpattern%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n/pattern/encoder/appenderrootlevelINFOappender-refrefCONSOLE//root/configuration四、踩坑总结编号坑解决1javax.*迁移到jakarta.*Spring Boot 3.x 全部用 jakarta替换 import2拦截器不走配置类加Configurationimplements WebMvcConfigurer3静态资源 404加spring.web.resources.static-locations配置4JSP 无法渲染Spring Boot 官方不推荐 JSP建议逐步替换为 Thymeleaf5事务不生效确保EnableTransactionManagement DataSource 配置正确五、迁移前后对比指标SSM老Spring Boot新配置文件数量6 个 XML 2 个 properties1 个 yml应用启动时间~120 秒~15 秒构建方式Maven 手动部署Maven java -jar部署方式打 war 丢 Tomcat打 jar 直接跑开发体验改一行配置重启半天热更新秒级生效六、写在最后SSM 迁移 Spring Boot 这件事技术难度不高但对耐心和细心的要求很高。一个合理的迁移节奏是第1天梳理老项目配置和依赖 → 第2天搭新项目框架 第3-5天逐模块迁移 → 第6-7天联调测试如果你也有老项目要迁移遇到搞不定的问题欢迎私信交流。接老项目迁移 / Java 后端开发有需要可私信联系。