news 2026/5/1 11:14:46

我记不住的那些spring/springboot差异

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我记不住的那些spring/springboot差异

Spring Boot 是基于 Spring Framework 的快速开发脚手架,其核心目标是简化 Spring 应用的初始搭建和开发过程。它不是替代 Spring,而是通过“约定优于配置”“自动配置”“起步依赖”等设计,解决了传统 Spring 开发中配置繁琐、依赖冲突、部署复杂等痛点。

一、核心设计理念:“约定优于配置”(Convention Over Configuration)

传统 Spring
  • 显式配置为主:几乎所有功能都需要手动配置(XML 或 JavaConfig)。例如:

    • 配置 DispatcherServlet(Spring MVC 入口)、视图解析器、数据源、事务管理器;

    • 整合 MyBatis 时需手动定义SqlSessionFactoryMapperScannerConfigurer

    • 配置日志(Log4j/Logback)、AOP 切面、安全规则等。

  • 决策成本高:开发者需为每个组件指定细节(如端口、路径、连接池参数),导致配置文件冗长(如applicationContext.xml动辄数百行)。

Spring Boot
  • 默认约定优先:基于“合理默认值”减少手动配置,仅在偏离默认时显式调整。例如:

    • 默认端口8080、上下文路径/、日志框架 Logback、JSON 解析器 Jackson;

    • 引入spring-boot-starter-web自动配置 Spring MVC、内嵌 Tomcat、静态资源映射;

    • 引入spring-boot-starter-data-jpa自动配置数据源、EntityManager、事务管理器。

  • “零配置”启动:通过@SpringBootApplication注解(组合了@Configuration@EnableAutoConfiguration@ComponentScan)一键启用自动配置,无需 XML。

也就是说

传统 Spring 的痛点是“配置冗余”:80% 的配置是“常规操作”(如 Web 应用用 Tomcat、JSON 用 Jackson),只有 20% 是个性化需求。开发者花大量时间写“本应默认”的配置,而非业务逻辑。

Spring Boot 的改进是:把 80% 的常规配置固化为“约定”,让开发者只关注 20% 的个性化配置。

二、依赖管理:起步依赖(Starter Dependencies) vs 手动管理

传统 Spring
  • 依赖碎片化:需手动引入大量独立依赖(如 Spring Core、Spring MVC、Jackson、Tomcat Embed 等),并自行协调版本兼容性(易出现“依赖地狱”)。

    示例(传统 Spring MVC 项目 pom.xml):

    <dependencies> <!-- Spring 核心 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.20</version> </dependency> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.20</version> </dependency> <!-- 内嵌 Tomcat --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>9.0.63</version> </dependency> <!-- JSON 解析 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency> <!-- ... 其他依赖(日志、验证、文件上传等) --> </dependencies>
  • 版本冲突风险:不同依赖可能依赖同一库的不同版本(如 Spring 和 Hibernate 依赖不同版本的 Jackson),需手动排除冲突。

Spring Boot
  • 起步依赖(Starters):将常用场景的依赖打包为“一站式” Starter,自动管理版本兼容。例如:

    • spring-boot-starter-web:包含 Spring MVC、内嵌 Tomcat、Jackson、Validation 等 Web 开发必备依赖;

    • spring-boot-starter-data-jpa:包含 Spring Data JPA、Hibernate、数据库连接池(HikariCP)等 ORM 依赖;

    • spring-boot-starter-test:包含 JUnit、Mockito、AssertJ 等测试依赖。

      示例(Boot Web 项目 pom.xml):

    <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 无需指定版本,由 spring-boot-starter-parent 统一管理 --> </dependency> </dependencies> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.3</version> <!-- Boot 统一管理所有依赖版本 --> <relativePath/> </parent>
  • 版本仲裁:通过spring-boot-dependencies父工程预定义数千个依赖的兼容版本,避免冲突。如需覆盖版本,可在pom.xml中显式声明。

三、部署方式:可执行 JAR(内嵌容器) vs 传统 WAR

传统 Spring
  • WAR 包部署:需打包为 WAR 文件,依赖外部 Servlet 容器(如 Tomcat、Jetty),部署流程为:

    1. 本地打包mvn clean package生成xxx.war

    2. 上传到服务器,放入 Tomcat 的webapps目录;

    3. 启动 Tomcat 容器加载应用。

  • 环境依赖:服务器需预装指定版本的 Servlet 容器,且应用与容器版本强耦合(如 Tomcat 9 不支持 Jakarta EE 9+)。

Spring Boot
  • 可执行 JAR/WAR:通过内嵌 Servlet 容器(Tomcat/Jetty/Undertow),打包为包含所有依赖的“胖 JAR”(Fat JAR),可直接通过java -jar运行:

    java -jar target/myapp-1.0.0.jar # 直接启动,无需外部容器
  • 部署简化

    • 无需预装容器,跨环境一致性高(开发/测试/生产环境使用相同 JAR);

    • 支持传统 WAR 部署(通过spring-boot-starter-tomcatprovided作用域,将容器交给外部管理);

    • 容器可配置(如修改端口:server.port=8081,或切换容器:spring-boot-starter-jetty)。

四、自动配置(AutoConfiguration):减少手动 Bean 定义

传统 Spring
  • 显式 Bean 定义:需通过 XML 或@Bean注解手动注册所有组件。例如,配置 Spring MVC 需定义:

    @Configuration public class MvcConfig implements WebMvcConfigurer { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } }
  • 整合第三方组件复杂:如整合 Redis 需手动配置RedisTemplateConnectionFactory,并处理序列化逻辑。

Spring Boot
  • 自动配置原理:基于类路径扫描​ 和条件注解@ConditionalOnClass@ConditionalOnMissingBean等),根据项目依赖自动注册 Bean。例如:

    • 当类路径存在DispatcherServlet.class(即引入spring-boot-starter-web),自动配置DispatcherServletHandlerMapping等 MVC 组件;

    • 当存在DataSource.classHibernate.class(即引入spring-boot-starter-data-jpa),自动配置EntityManagerFactoryTransactionManager

    • 当存在RedisTemplate.class(即引入spring-boot-starter-data-redis),自动配置连接池和序列化器。

  • 自定义配置覆盖:通过application.properties@Configuration类覆盖默认配置。例如:

    # 修改内嵌 Tomcat 端口 server.port=8081 # 配置数据源 spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456

自动配置的本质:Spring Boot把传统Spring中那些重复的、模板化的Bean配置都写好了,根据你添加的依赖自动创建这些Bean,你只需要通过properties文件调整参数就行

工作流程:

  1. Spring Boot启动时扫描所有jar包的META-INF/spring.factories
  2. 找到所有自动配置类(比如DataSourceAutoConfiguration)
  3. 检查@Conditional条件是否满足:
    • classpath里有没有DataSource.class? ✓ (因为你添加了JDBC依赖)
    • 你自己配置了DataSource了吗? ✗ (没配置)
  4. 条件都满足,创建DataSourceBean
  5. application.properties读取配置注入到Bean里
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:11:01

图解说明Vivado注册2035在自动化测试平台的应用逻辑

Vivado注册2035&#xff1a;如何让自动化测试平台“永不掉线”&#xff1f; 你有没有经历过这样的噩梦&#xff1f;凌晨两点&#xff0c;CI流水线突然中断——几百个FPGA回归测试用例刚跑了一半&#xff0c;日志里赫然跳出一行红字&#xff1a; License checkout failed: expi…

作者头像 李华
网站建设 2026/5/1 5:04:31

RePKG终极指南:解锁Wallpaper Engine资源处理的效率革命

RePKG终极指南&#xff1a;解锁Wallpaper Engine资源处理的效率革命 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 还在为无法查看Wallpaper Engine壁纸包内部资源而烦恼&#xff…

作者头像 李华
网站建设 2026/5/1 2:37:25

Appium效率革命:从8小时到1小时的自动化测试转型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 设计一个Appium测试效率对比工具&#xff0c;能够自动统计手工测试和自动化测试在相同测试用例下的执行时间、缺陷发现率和回归成本。要求生成对比图表&#xff0c;提供优化建议。…

作者头像 李华
网站建设 2026/5/1 7:46:21

用LangChain4J快速验证AI产品原型的5种方法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个可演示的电商AI助手原型&#xff1a;1. 商品推荐功能 2. 自然语言搜索 3. 订单状态查询 4. 用户反馈分析 5. 模拟数据生成。要求使用内存数据库&#xff0c;无需完整后端&…

作者头像 李华
网站建设 2026/5/1 4:59:00

MAT下载效率翻倍:AI自动化方案对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个MAT文件自动化下载与处理工具&#xff0c;对比传统手动方法和AI自动化方案的效率。工具应支持批量下载MAT文件、自动解析数据、生成分析报告&#xff0c;并统计两种方法的…

作者头像 李华
网站建设 2026/5/1 5:01:28

vivado安装包版本选择建议:新手必看核心要点

Vivado安装包怎么选&#xff1f;新手避坑指南&#xff1a;从版本到兼容性一文讲透 你是不是也遇到过这种情况&#xff1a;兴冲冲下载完Vivado&#xff0c;装好后打开却发现开发板“找不到”&#xff1b;或者综合到一半直接崩溃&#xff0c;报错“内存溢出”&#xff1b;又或者…

作者头像 李华