YAOTU INSIGHTS

基于SSM的人事管理系统:从源码部署到Spring Boot迁移实战指南

基于SSM的人事管理系统:从源码部署到Spring Boot迁移实战指南
简介这是一套面向Java初学者与Web开发入门者的完整人事管理系统实战项目基于SSMSpringSpringMVCMyBatis主流框架构建覆盖企业级后台管理系统的典型业务场景。资源包共包含数百个文件含源码、配置、JSP页面、SQL脚本及静态资源以Java类文件、JSP视图页、XML映射配置、SQL建表脚本和jQuery前端交互代码为主整体压缩后大小为59.18MB。已有1034人学习下载适合作为课程设计、毕业设计或SSM技术栈综合实训案例。读者可直接导入IDEA/Eclipse运行完整体验用户权限控制、部门/职位/员工全生命周期管理、公告发布与下载中心含Spring MVC文件上传下载实现等核心功能数据库脚本位于hrm/src/main/webapp/db/hrm.sql明确要求JDK 1.8与Tomcat 9环境具备良好的工程结构与可调试性。1. 认清这套系统的真面目SSM人事管理系统的典型技术构成拿到一个名为基于SSM人事管理系统源码数据库脚本.rar的压缩包你的第一反应大概率是赶紧解压、导入IDEA、点运行。但在我反复帮人处理过同类项目之后我的建议是先别急着启动花一小时把整个系统的技术构成和业务模块搞清楚后面能省下你一整天排错的时间。这类经典SSM人事管理系统的价值从来不只是能跑而是它把Java Web开发中最核心的一套技术栈完整串了起来。先说技术栈。SSM不是某个具体框架而是三个框架的组合Spring负责对象管理和事务SpringMVC负责Web层的请求分发MyBatis负责数据库的持久化操作。打个比方三者的分工就像一家公司的三个部门Spring是后勤总管所有对象的创建、依赖关系、事务边界都由它统一调配SpringMVC是前台接待所有HTTP请求进来先由它解析、路由再派发给对应的业务处理人MyBatis是数据库翻译官你把SQL告诉它它负责把结果集变成Java对象把你传参的对象变成SQL参数。三个框架各管一段互相不越界这就是SSM项目好理解的地方。再说业务模块。人事管理系统不管具体叫什么名字核心业务基本逃不出以下几块员工档案管理这也是整个系统中数据量最大、使用频率最高的模块包括员工的基本信息、入职信息、岗位信息部门管理维护组织架构的树形结构员工表通过部门ID与部门表关联考勤管理记录员工的出勤、请假、加班情况薪资管理根据员工的基本工资、岗位工资、考勤结果计算出应发工资这个模块通常还带简单的统计功能系统用户管理也就是登录和权限管理管理员、HR、普通员工能看到的页面和能执行的操作是不一样的。很多初学者容易忽略的一点是这套系统为什么到现在还有人用SSM而不是Spring Boot一个原因是教学场景很多学校的Java Web课程设计、毕业设计仍然指定SSM作为题目要求因为SSM把配置过程完全暴露出来学生能理解原来是这么配出来的另一个原因是历史遗留项目不少中小企业早年的内部管理系统就是SSM架构后续一直在维护新手入职后接手的第一份代码往往就是这类项目。所以学会看SSM项目不是学一门过时的技术而是在补Java Web最重要的一块底子。后面你去看Spring Boot的自动配置时会发现它不过是把这些东西帮你做完了而已。2. 解压源码包之后的第一步环境对齐和项目导入我见过太多人拿到源码包后直接双击pom.xml结果报了一堆错然后到处问为什么我导入不成功。绝大多数情况下问题出在环境版本和原作者不一致而不是源码本身有问题。SSM项目对环境的敏感度比Spring Boot高很多尤其是JDK版本和Tomcat版本稍微偏一点就可能起不来。先说环境组合这是经过大量项目验证比较稳妥的一套组件版本建议说明JDK1.8老项目首选兼容性最好Maven3.6.33.6.x均可3.8需要留意仓库配置差异Tomcat8.5配合JDK1.8非常稳定MySQL5.7老脚本无需改MySQL 8.0也能用但要看驱动和URLIDEA2020.2以上新版IDEA对Maven项目支持都很成熟Spring / SpringMVC5.2.x两者版本必须保持一致MyBatis3.5.x配合mybatis-spring 2.0.x这个表不是随便列的。很多人卡在启动阶段就是吃了版本不匹配的亏。比如用JDK 11去跑一个Spring 4的老项目javax包的问题会让你怀疑人生再比如MySQL 8.0下用旧驱动com.mysql.jdbc.Driver直接就报ClassNotFoundException。所以导入源码之前先把本机环境统一到上面这张表能省掉相当一部分麻烦。导入步骤本身并不复杂但有几个细节容易漏。第一步解压后先看目录结构标准的Maven web项目一定是src/main/java、src/main/resources、src/main/webapp三块如果看到的是.classpath、.project、WebContent这种目录说明这是个Eclipse工程在IDEA里导入方式略有不同需要选New - Project from Existing Sources之后在Project Structure里手动指定src/main/webapp为Web资源目录。第二步File - New - Project from Existing Sources在打开的文件选择框中直接定位到pom.xml所在目录IDEA会识别为Maven项目。第三步等待Maven完成依赖下载这一步时间长短取决于网络建议检查IDEA的Maven配置确保settings.xml里配置了阿里云镜像否则下载Spring相关依赖可能慢到你怀疑人生。第四步是配置Tomcat。Run - Edit Configurations - 加号 - Tomcat Server - Local在Deployment页签里添加Artifact选xxx:war exploded这种模式开发调试时用exploded比war方便很多改完代码重新编译就能生效不用整个重新打包。Application context一般设成/如果你设成/hrms那访问路径就要带项目前缀很多新手在部署后死活访问不到页面就是这里填错了。第五步修改数据库连接配置。SSM项目的数据库配置通常在jdbc.properties或application.properties里把用户名、密码改成你本地的确认数据库名称和你导入的脚本一致。做完这些之后再执行数据库脚本、启动Tomcat。启动前建议先看一眼控制台有没有报错Build - Rebuild Project确保编译一次避免因为旧class文件导致奇怪的问题。我个人的习惯是每次拿到新项目先按编译 - 启动 - 看日志这个顺序来任何一步报错都先解决再往下走不要一口气点完所有按钮然后面对一屏红色日志发呆。3. 数据库脚本别急着跑先读透它再动手压缩包名字里专门强调了数据库脚本说明这不是一个可选项而是系统能不能跑起来的关键前置条件。但我要说的是不要闭着眼双击脚本就执行先把脚本内容从头到尾读一遍。一方面是为了确认表结构和业务逻辑是否对应另一方面是提前发现可能存在的兼容性问题免得导入时报错再回头补课。一个典型的人事管理系统数据库侧至少有这几张核心表。我拿最常见的表结构设计举例说明t_emp员工表主键通常用工号或自增id常用字段包括emp_no工号、emp_name姓名、gender性别、birth_date出生日期、phone手机号、email邮箱、dept_id部门ID外键关联部门表、position岗位、hire_date入职日期、status在职/离职状态。注意emp_no和status这两个字段很关键工号是业务上唯一标识状态字段用于员工离职后数据保留而不直接删除。t_dept部门表id、dept_name、dept_leader_id部门负责人是一个员工ID、parent_id上级部门ID用于组织树。parent_id为0表示顶级部门这种设计比单独一张层级表简单对人事系统来说够用。t_attendance考勤表emp_id、att_date考勤日期、status正常/迟到/早退/缺勤/请假、remark。这个表一天一个人通常一条记录统计月出勤次数时按员工和时间范围group by即可。t_salary薪资表emp_id、salary_month工资月份、base_salary基本工资、post_salary岗位工资、bonus绩效奖金、deduction扣款、total_salary实发工资。t_user系统用户表id、username、password、emp_id关联员工表、role角色1管理员/2HR/3普通员工、status。下面是一段典型员工表的建表脚本你可以对照着自己项目里的脚本看看是否一致CREATE TABLE t_emp ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键ID, emp_no varchar(20) NOT NULL COMMENT 工号, emp_name varchar(50) NOT NULL COMMENT 姓名, gender char(1) DEFAULT 1 COMMENT 性别1男 2女, birth_date date DEFAULT NULL COMMENT 出生日期, phone varchar(20) DEFAULT NULL COMMENT 手机号, email varchar(100) DEFAULT NULL COMMENT 邮箱, dept_id int(11) DEFAULT NULL COMMENT 部门ID, position varchar(50) DEFAULT NULL COMMENT 岗位, hire_date date DEFAULT NULL COMMENT 入职日期, status int(1) DEFAULT 1 COMMENT 状态1在职 0离职, PRIMARY KEY (id), UNIQUE KEY uk_emp_no (emp_no), KEY idx_dept_id (dept_id) ) ENGINEInnoDB AUTO_INCREMENT1001 DEFAULT CHARSETutf8mb4 COMMENT员工表;这段脚本里有几个值得注意的设计细节。工号加了唯一索引uk_emp_no避免系统里出现重复工号dept_id加了普通索引idx_dept_id因为按部门筛选员工是一个高频操作不加索引在数据量大时会有明显性能问题AUTO_INCREMENT1001是为了让初始员工ID从1001开始这样和工号做区分避免ID暴露员工顺序。这些设计在实际开发中可能不算复杂但对于一个教学性质的人事系统来说已经足够规范。脚本运行阶段最常见的坑我按出现频率排一下MySQL版本兼容问题。老脚本如果用的是utf8字符集在MySQL 8.0下运行没问题但反过来新脚本用了utf8mb4而你的数据库还是5.5就会报字符集不支持。5.7以上基本都支持utf8mb4建议优先用这个。排序规则冲突。创建表时如果指定了COLLATE而导入的库默认排序规则不一致会导致关联查询报错。解决办法是导入前先创建库时明确指定比如CREATE DATABASE hrms DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。外键约束导致导入顺序问题。如果脚本里有外键必须先创建被引用的表部门表再创建引用表员工表。但很多教学脚本为了省事根本没建外键只保留逻辑关联这种反而导入更顺畅。读脚本的另一个价值在初始化数据。通常脚本最后会插入管理员账号和几条测试数据比如INSERT INTO t_user (username, password, role) VALUES (admin, MD5(123456), 1);这时候你就能知道系统默认的登录账号密码是什么。很多人在系统能打开之后卡在登录界面就是因为不知道初始账户密码。如果你的脚本里没有初始化用户数据那就要在数据库里手动插入一条否则登录功能再怎么调都进不去。4. SSM整合的四个核心配置文件跑不起来的问题九成出在这里SSM项目的配置是整个系统的骨架也是初学者最容易懵的地方。一个SSM web项目通常有四个核心配置文件它们各管一段、层层嵌套。我在帮人排查项目启动问题时有一个经验Tomcat能正常启动、页面能打开说明web.xml基本没问题一旦涉及页面之外的报错八成是另外三个配置文件的细节没对上。4.1 web.xml整条链路的入口web.xml是Java Web应用的入口SSM的整合从这里开始。它要干三件事配置Spring容器监听器、配置DispatcherServlet前端控制器、配置字符编码过滤器。核心片段长这样context-param param-namecontextConfigLocation/param-name param-valueclasspath:applicationContext.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping servlet servlet-namedispatcherServlet/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-mvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedispatcherServlet/servlet-name url-pattern//url-pattern /servlet-mapping这个文件最大的坑在于url-pattern。/表示除了JSP之外的请求都交给DispatcherServlet处理这种配置是SSM最标准的写法但也意味着静态资源JS、CSS、图片必须先经过SpringMVC的静态资源映射处理否则会被SpringMVC当成一个普通请求去匹配Controller最后全部404。这个问题我会在下面踩坑部分详细说。4.2 applicationContext.xmlSpring的容器配置applicationContext.xml负责Spring容器层面的配置包扫描排除Controller、数据源、事务管理、MyBatis整合。典型配置结构是这样的context:component-scan base-packagecom.hrms context:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller/ /context:component-scan bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property namemapperLocations valueclasspath:mapper/*.xml/ property nametypeAliasesPackage valuecom.hrms.entity/ /bean bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.hrms.dao/ /bean bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean tx:annotation-driven transaction-managertransactionManager/注意context:component-scan这里有一个排除Controller的配置。原因是Spring容器和SpringMVC容器是两个容器如果Controller被Spring容器也扫描进去会出现事务失效、AOP代理异常、Bean重复创建等问题。这是一个非常隐蔽的坑不报明显错误但就是行为不对很多人在Service层加事务不生效时根本想不到是这里的问题。4.3 spring-mvc.xml控制层的配置这个文件管Controller层的注解扫描、视图解析器、静态资源映射和文件上传。核心内容context:component-scan base-packagecom.hrms.controller/ mvc:annotation-driven/ bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/views// property namesuffix value.jsp/ /bean mvc:resources mapping/static/** location/static//视图解析器的prefix和suffix是一个高频出错点。如果你Controller里return emp/list解析器会拼成/WEB-INF/views/emp/list.jsp如果目录结构对不上页面就是404。这个问题在导入别人项目时尤其常见因为每个人的webapp目录结构都不一样你必须对照实际目录来调整这个配置。4.4 mybatis-config.xmlMyBatis的全局配置MyBatis的全局配置一般比较简单最核心的就两件事开启驼峰映射和设置日志实现。驼峰映射这个配置非常关键很多新手在Mapper里写了select *发现返回的实体类属性全是null就是因为数据库字段emp_name无法自动映射到Java属性empName。开启下面这行配置可以解决这个问题settings setting namemapUnderscoreToCamelCase valuetrue/ setting namelogImpl valueSTDOUT_LOGGING/ /settings如果你拿到的项目没有mybatis-config.xml而是把这些配置放在applicationContext.xml的sqlSessionFactory里也是可以的这类项目通常是在configurationProperties或configuration属性上做的配置。两类写法没有对错之分但你要确认你的源码到底用的是哪一种排查问题时不至于找错地方。5. 登录与权限一个安全的人事系统从哪里开始人事管理系统涉及员工隐私数据登录和权限是绕不开的核心模块。很多人觉得登录不就是比对一下用户名密码嘛但在这个系统里登录入口还承担了权限边界划分的任务管理员能看薪资数据HR能改员工档案普通员工只能看自己的信息。如果登录环节出了问题后面的一切都无从谈起。5.1 登录流程的完整链路一次登录请求从浏览器到数据库在SSM项目里大概是这么走的用户在login.jsp输入用户名密码表单提交到/login接口。DispatcherServlet拦截到请求根据请求路径和参数匹配到UserController的login()方法。Controller调用UserService.login(username, password)方法。Service层先对密码做加密处理老项目通常是MD5严谨一点的会加盐再调用UserMapper查询用户是否存在。查询成功则把User对象放进Session并跳转到首页失败则返回错误提示留在登录页。用户每次访问受保护资源时过滤器或拦截器检查Session里有没有登录用户没有就重定向回登录页。这里有一个典型的实现细节密码入库前必须加密。很多学习项目的脚本里密码直接明文存了这是不安全的但你可以理解为教学项目为了演示方便。如果是自己维护建议至少在DAO层或Service层做一次MD5加盐处理千万不要明文存密码也别在后端日志里把完整密码打出来。5.2 拦截器实现登录校验和Spring Boot不同SSM的登录拦截通常靠SpringMVC的HandlerInterceptor来实现。下面是一个标准的登录拦截器public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session request.getSession(); User user (User) session.getAttribute(loginUser); if (user null) { // 判断请求是否是Ajax请求 String requestedWith request.getHeader(X-Requested-With); if (XMLHttpRequest.equals(requestedWith)) { response.setStatus(901); // 自定义状态码前端判断后跳转登录页 } else { response.sendRedirect(request.getContextPath() /login); } return false; } return true; } }然后在spring-mvc.xml里注册这个拦截器并配置哪些路径需要拦截、哪些放行mvc:interceptors mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login/ mvc:exclude-mapping path/static/**/ mvc:exclude-mapping path/captcha/ bean classcom.hrms.interceptor.LoginInterceptor/ /mvc:interceptor /mvc:interceptors这里的mvc:exclude-mapping path/login/非常重要。如果不放行登录接口用户没登录的时候会被拦截器拦住被重定向到登录页然后因为请求登录页也被拦截直接形成死循环。这个问题我见过不止一次让人崩溃的程度绝对是TOP3级别。还有个细节是登录接口的提交路径如果和跳转路径不一样比如登录页是/login表单提交的是/doLogin那/doLogin也要放进白名单否则永远登录不进去。5.3 基于角色的菜单权限系统要做好角色权限单靠登录拦截还不够。人事管理系统里常见的角色是管理员、HR、普通员工不同的角色看到的菜单和按钮不一样。SSM项目里实现方式通常有两种。一种是前端菜单按角色动态渲染登录时把当前用户的角色信息放进SessionJSP页面里用c:if test${sessionScope.loginUser.role 1}控制菜单是否显示。另一种是后端接口做权限校验在Controller方法上判断角色权限不足时直接返回403。真实项目中两种配合使用前端控制展示后端控制数据安全。我自己的建议是如果你只是做课程设计或毕业设计前端菜单按角色渲染加一个登录拦截器已经足够如果是公司项目要上线必须在每个写操作接口上做服务端权限校验。因为前端控制只是让用户看不到菜单懂技术的人完全可以直接构造请求去访问后台接口后端不校验等于门户大开。6. 从能跑到能上线我踩过最深的几个坑这部分写给我自己也写给所有曾经被SSM项目折腾到怀疑人生的人。这些坑是我和身边同事、同学在实际使用、部署这类项目时反复遇到过的按严重程度从高到低排。6.1 坑位一Tomcat启动报ClassNotFoundException或NoClassDefFoundError这个问题最常见的根源是项目依赖没有完整部署到Tomcat。直接表现是启动报错要么找不到Spring的类要么找不到MyBatis的类。在IDEA里点启动时如果Tomcat的Deployment配置里没有正确添加Artifact或者Artifact类型选错了就会出现代码在编译时正常但运行时找不到类的现象。解决方法是File - Project Structure - Artifacts把Available Elements里的xxx:war exploded加入左侧的Deployment包让所有依赖jar包完整打包。然后回看Edit Configurations - Deployment确认添加的Artifact在前面配置的Context路径下。还有一个很隐蔽的情况是Maven依赖下载不全本地仓库里只有lastUpdated结尾的失败记录文件没有真正的jar包。遇到这种情况把本地仓库对应目录下的*.lastUpdated文件删掉重新ReimportMaven项目。如果你用Maven彻底重新下载过还是报NoClassDefFoundError检查是不是IDE的Build工具切换成了Gradle导致Maven依赖没被正确引入。6.2 坑位二页面中文乱码包括页面、控制台、数据库三处SSM项目的中文乱码是个老传统。典型的情况有三种页面显示乱码、控制台输出乱码、数据库存取乱码。三者的根源不一样处理方式也不同。页面乱码检查JSP页面头部的% page contentTypetext/html;charsetUTF-8 languagejava %并且检查浏览器编码是否设置为UTF-8。如果有的话确保web.xml里的CharacterEncodingFilter配置存在且url-pattern为/*这个过滤器负责把请求参数从字节流解码成字符不加这个过滤器表单提交的中文大概率乱码。控制台乱码IDEA的控制台默认编码可能不是UTF-8在Help - Edit Custom VM Options里加上-Dfile.encodingUTF-8重启IDEA。数据库乱码检查连接URL确认带上useUnicodetruecharacterEncodingUTF-8参数同时确认表和库的字符集是utf8mb4或者utf8。比如jdbc.urljdbc:mysql://localhost:3306/hrms?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai如果你用的是MySQL 8.x驱动类要改成com.mysql.cj.jdbc.Driver并且URL中必须带serverTimezone否则会报时区错误。老项目里写的是com.mysql.jdbc.Driver这个驱动类在MySQL 8.x下已经废弃了。6.3 坑位三404和500处理思路完全不同启动成功后访问页面报404或500很多人不喜欢看具体状态码上来就问为什么打不开。这两个错误码的排查方向完全不同404资源不存在。先判断是请求路径错了还是Controller返回的视图前缀后缀和实际目录不匹配。请求路径对了但JSP找不到多半是InternalResourceViewResolver的prefix/suffix没有对到视图目录。还有一种可能是SpringMVC把静态资源请求当成动态请求处理了你要确认mvc:resources mapping/static/** location/static//这个静态资源映射配置是否存在没有这个配置CSS、JS全部不可用页面打开就是光秃秃的。500服务器内部错误异常信息一定在Tomcat控制台。最常见的是Mapper的XML文件里SQL写错、字段或参数对不上、空指针注入失败。这种时候第一件事不是去改代码而是去控制台找到Caused by那一行问题根源百分之百在那里。我见过有人不看日志直接重写了整个Controller结果发现只是SQL语句里一个字段名写错了。拿到错误日志后对照mapper/*.xml里的SQL和实体类字段逐一核对问题很快能定位。6.4 我给新手的排查顺序建议根据我处理这类项目的经验建议你按以下顺序排查SSM项目的所有问题先看Tomcat控制台有没有启动异常再看浏览器控制台和页面状态码接着看IDEA右下角Maven是否还有依赖没加载完最后看数据库连接和SQL是否正确。前两步能定位80%的问题。如果启动正常、访问页面有数据但中文乱码或权限不对再回到配置文件。不要一上来就怀疑源码有问题——这类项目能被分享出来大部分是经过运行的问题几乎都在环境配置。7. 如果这个SSM项目要改造成Spring Boot核心关注点在哪里很多人跑通SSM项目后下一步想的是能不能把它改成Spring Boot这个问题值得专门聊聊因为从SSM到Spring Boot的迁移过程恰恰是把SSM整合原理学透的最佳验证方式。改造成本主要集中在四个方向。第一个是依赖替换。SSM项目里的Spring、SpringMVC、MyBatis、Druid等依赖换成spring-boot-starter-web和mybatis-spring-boot-starter两个Starter依赖就覆盖了大部分。但要注意MyBatis的Starter在Spring Boot 2.x和3.x下的groupId不同老项目从2.x迁移到3.x需要调整。第二个是配置整合。SSM里的web.xml、applicationContext.xml、spring-mvc.xml、mybatis-config.xml四个配置文件在Spring Boot里被合并成一个application.yml。对应关系如下SSM配置文件Spring Boot中的替代web.xmlapplication.yml中的spring.mvc、server配置applicationContext.xmlConfiguration配置类或application.ymlspring-mvc.xmlConfiguration实现WebMvcConfigurermybatis-config.xmlapplication.yml中mybatis.*配置比如SSM里配置的静态资源映射在Spring Boot里你要实现WebMvcConfigurer的addResourceHandlers方法或者直接用默认静态路径。拦截器的注册方式也从spring-mvc.xml变成了WebMvcConfigurer的addInterceptors方法。这种一一对应关系如果你在SSM阶段认真看过配置文件理解起来会非常快。第三个是数据源和事务。SSM里手动创建的DruidDataSource在Spring Boot里只要引入druid-spring-boot-starter然后在application.yml里写上spring.datasource相关信息就完成配置。事务还是通过Transactional注解但Spring Boot会自动配置事务管理器不需要手动声明。第四个是启动类的结构。Spring Boot需要一个主启动类标注SpringBootApplication它承担了SSM中ContextLoaderListener和DispatcherServlet自动装配的职责。你之前通过配置文件手动做的一切Spring Boot都用自动配置帮你默认做好了但如果你的项目有特殊需求就要知道在哪个配置类里覆写默认行为。如果你有空闲时间我强烈建议你把这个SSM人事管理系统原封不动地改造成Spring Boot版本。改造时不要新起一个空项目重写而是在现有代码基础上逐步替换依赖和配置每替换一步就跑一次测试确认Controller、Service、Mapper三层都没被破坏。这个过程会逼着你搞清楚很多以前没注意的细节比如MapperScan在哪里生效、Transactional是否还能正常工作、JSON序列化发生了哪些变化。等你能把这个项目完整改成Spring Boot跑起来你对这两套体系的理解会有一个非常明显的跃迁。本文还有配套的精品资源点击获取