快速理解Spring 和 Spring Boot 的核心区别

1. 定位与目标

  • Spring Framework

    • 定位:一个以解耦模块化为核心的企业级 Java 开发框架,提供 IOC(控制反转)、AOP(面向切面编程) 等基础功能。
    • 解决的问题:通过依赖注入和模块化设计简化复杂的企业应用开发。
    • 缺点:需手动配置 XML 或 Java 类,依赖管理和整合第三方库费时费力(例如集成 MySQL + Hibernate + Spring MVC)。
Spring 是一个“积木式”框架,按需选装不同模块:

image-20250227112134392

开发痛点
每个模块需单独引入并配置(如整合 Hibernate 需手动配置 SessionFactoryDataSource

  • Spring Boot

    • 定位:Spring 的上层扩展框架,目标是快速启动和简化配置。(“约定优于配置”)
    • 解决的问题:通过自动配置(Auto-Configuration)和 Starter 依赖包,让开发者无需关心繁琐的 XML 和依赖冲突。
    • 示例:引入 spring-boot-starter-web 后,自动集成 Tomcat、Jackson 和 Spring MVC,开发者只需专注于业务代码。
Spring Boot 在 Spring 基础上新增两个核心层:

image-20250227112900429

Starter 示例
使用 spring-boot-starter-data-jpa 会自动引入:

  • Hibernate(ORM 实现)
  • Spring Data JPA(DAO 抽象层)
  • 数据库驱动(如 MySQL Connector)

自动配置示例
当检测到 DataSource 配置存在且 Hibernate 在 Classpath 中时,Spring Boot 自动创建:

  • EntityManagerFactory
  • JpaTransactionManager

2. 核心差异

image-20250227111216407

3. 代码示例对比

1. Spring 开发流程

步骤 1:手动添加 Maven 依赖

<dependencies>
    <!-- Spring Core -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    
    <!-- Spring MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    
    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
    </dependency>
</dependencies>

问题:需自解决依赖版本冲突。

步骤 2:配置 XML(或 Java Config)
applicationContext.xml → 配置包扫描、DataSourceSessionFactory、事务管理器、视图解析器等。

<!-- 手动配置 DataSource -->
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

步骤 3:代码编写 → 冗余的模板配置

public class UserController {
    @Autowired
    private UserService userService; // 需手动启用包扫描
}

@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private SessionFactory sessionFactory; // 需在配置中声明 Bean
}

2. Spring Boot 开发流程

步骤 1:使用 Spring Initializr 勾选依赖

  • Spring Web
  • Spring Data JPA
  • MySQL Driver

步骤 2:application.yml → 极简配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update

步骤 3:直接编写业务代码

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository; // 由 Spring Data JPA 自动创建实现类
}

// Spring Data JPA 直接提供基础 CRUD 方法
public interface UserRepository extends JpaRepository<User, Long> { }

4.工作原理深度解析

1. Spring Boot 自动配置机制

Spring Boot 通过 条件注解(Conditional) 动态判断是否启用某些配置。

代码示例:Spring Boot 内嵌的 DataSourceAutoConfiguration

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) // 条件1:存在 DataSource 类
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory") // 条件2:无其他数据源配置
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置到 DataSourceProperties
public class DataSourceAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean(DataSource.class) // 条件3:用户未自定义 DataSource
    public DataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().build(); // 创建 DataSource
    }
}

关键点

  • 仅在满足所有 @Conditional 条件时才会注册 DataSource Bean。
  • 如果用户已手动配置 DataSource@Bean),则跳过自动配置。
2. Spring Boot Starter 的工作流程

spring-boot-starter-web 为例,其内部逻辑:

  1. 引入 spring-webmvcspring-webtomcat-embed-core 等依赖。
  2. 触发 WebMvcAutoConfiguration → 自动配置 DispatcherServletViewResolver 等。
  3. 自动启用默认错误处理(BasicErrorController)、静态资源映射(/static 目录)。

4.如何选择?

适用场景对比

image-20250227140124823

技术选型决策树

是否需要快速启动项目?  
   ├── 是 → Spring Boot  
   └── 否 → 是否需要微服务/云原生部署?  
          ├── 是 → Spring Boot + Spring Cloud  
          └── 否 → Spring(如系统需与遗留框架深度集成)

5.学习路径与调试技巧

1. 学习路线规划
  • 第 1 阶段:掌握 Spring Core → 理解 IOC、AOP、Bean 生命周期。
  • 第 2 阶段:学习 Spring MVC → 手动搭建 Web 应用,配置拦截器、视图解析等。
  • 第 3 阶段:过渡到 Spring Boot → 熟悉自动配置原理、Starter 使用。
  • 第 4 阶段:深入高级主题 → Spring Boot 源码、自定义 Starter、健康检查与监控。
2. Spring Boot 调试技巧
  • 查看自动配置结果:在 application.properties 中添加 debug=true,启动时打印已启用的自动配置类。
  • 排除不需要的自动配置
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication { ... }

分析 Bean 依赖关系:使用 IDEA 的 Diagram 工具查看 Bean 的依赖图。

总结

  • Spring 是基础:如汽车发动机,需要自行组装零件(手动配置)才能行驶。
  • Spring Boot 是完整车型:提供自动挡、导航系统(自动配置),适合快速上路。
  • 关联性:Spring Boot ≠ 取代 Spring,而是基于 Spring 构建的“开发者友好层”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978803.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaSE-1】初识Java

1、Java 是什么? Java 是一种优秀的程序设计语言,人类和计算机之间的交流可以借助 Java 这种语言来进行交流,就像人与人之间可以用中文、英语,日语等进行交流一样。 Java 和 JavaScript 两者有关系吗? 一点都没有关系!!! 前端内容:HTML CSS JS,称为网页三剑客 2、JDK 下…

【新手入门】SQL注入之盲注

一、引言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办? 例如应用程序返回到一个"通用的"的页面&#xff0c;或者重定向一个通用页面(可能为网站首页)。这时&#xff0c;我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无…

docker本地镜像源搭建

最近Deepseek大火后&#xff0c;接到任务就是帮客户装Dify&#xff0c;每次都头大&#xff0c;因为docker源不能用&#xff0c;实在没办法&#xff0c;只好自己搭要给本地源。话不多说具体如下&#xff1a; 1、更改docker的配置文件&#xff0c;添加自己的私库地址&#xff0c…

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接

官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…

Win10环境借助DockerDesktop部署单节点Redis6

Win10环境借助DockerDesktop部署单节点Redis6 前言 在后端和大数据开发中&#xff0c;Redis是非常常见的一个组件&#xff0c;常用作KV键值对存储及分布式锁或缓存加速。 之前笔者使用Win版Redis实现了本地部署&#xff1a; https://lizhiyong.blog.csdn.net/article/detai…

【AIGC系列】3:Stable Diffusion模型原理介绍

目录 1 前言2 基础概念2.1 Latent space2.2 AutoEncoder2.3 VAE2.4 扩散模型2.5 多模态交叉注意力 3 Stable Diffusion原理4 整体框架4.1 文生图4.2 图生图4.3 修复 1 前言 Stable diffusion是一个基于 Latent Diffusion Models&#xff08;潜在扩散模型&#xff0c;LDMs&…

七、Three.jsPBR材质与纹理贴图

1、PBR材质金属度和粗糙度 1、金属度metalness 金属度属性.metalness表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。 threejs的PBR材质&#xff0c;.metalness默认是0.5,0.0到1.0之间的值可用于生锈的金属外观 new THREE.MeshStandardMaterial({met…

解决npm run dev报错

解决&#xff1a;Node.js 版本更新后与 OpenSSL 不兼容导致的npm报错“Error: error:0308010C:digital envelope routines::unsupported” 方法一&#xff1a;更改系统环境变量方法二&#xff1a;更改项目环境变量方法三&#xff1a;更换 Node.js 版本方法四&#xff1a;升级依…

MySQL零基础教程10—正则表达式搜索(下)

前边已经初步认识了正则表达式&#xff0c;今天继续来看在mysql中使用正则表达式搜索的其他用法 mysql正则表达式的“或” 使用正则表达式可以帮助我们更加灵活地进行“或”条件的数据检索&#xff0c;直接上例子&#xff1a; 场景一&#xff1a;查询教师表中&#xff0c;院…

Hadoop第一课(配置linux系统)

1、让hadoop用户&#xff0c;有root权限&#xff0c;如果可以不输密码更好&#xff1a; (1)先登入root用户 (2)visudo命令进入配置文件 (3)找到 root ALL(ALL) ALL这一行&#xff0c;在该行下面增加:hadoop ALL(ALL) ALL &#xff08;&#xff1a;set nu可以显示行号&#xff…

量子计算的数学基础:复数、矩阵和线性代数

量子计算是基于量子力学原理的一种新型计算模式,它与经典计算机在信息处理的方式上有着根本性的区别。在量子计算中,信息的最小单位是量子比特(qubit),而不是传统计算中的比特。量子比特的状态是通过量子力学中的数学工具来描述的,因此,理解量子计算的数学基础对于深入学…

大湾区经济网报道:拉美电商交易额连续三年增速超35%

2025全球时尚产业发展论坛发布预测&#xff0c;2025年拉美服装市场规模将达1016.9亿美元 大湾区经济网广州2月27日电&#xff08;王峰&#xff09; 26日&#xff0c;由广东省网商协会、树籽全球主办&#xff0c;广州市商务局指导的“2025全球时尚产业发展论坛暨拉美时尚趋势发…

java面试场景问题

还在补充&#xff0c;这几天工作忙&#xff0c;闲了会把答案附上去&#xff0c;也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1&#xff1a;基于唯一请求 ID&#xff08;幂等 Token&#xff09; 思路&#xff1a;前端生成 一个唯一的 requestId&#xff08;…

游戏引擎学习第124天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天&#xff0c;我们已经介绍了多线程的一些基础知识&#xff0c;包括如何创建工作队列以及如何在线程中处理任务。今天&#xff0c;重点是解决那些我们之前没有注意到…

Elasticsearch:使用阿里云 AI 服务进行嵌入和重新排名

作者&#xff1a;来自 Elastic Toms Mura 将阿里云 AI 服务功能与 Elastic 结合使用。 更多阅读&#xff0c;请参阅 “Elasticsearch&#xff1a;使用阿里 infererence API 及 semantic text 进行向量搜索”。 在本文中&#xff0c;我们将介绍如何将阿里云 AI 功能与 Elastics…

面试问题——如何解决移动端1px 边框问题?

面试问题——如何解决移动端1px 边框问题&#xff1f; 最近&#xff0c;不少小伙伴向我反映&#xff0c;他们在面试中频繁被问到关于1px边框的问题。这个看似老生常谈的话题&#xff0c;没想到在面试中的出现率依然这么高&#xff0c;着实让我有些意外。对于那些对这个问题感到…

Redis的介绍、安装和配置

文章目录 一、redis官网二、redis是什么三、能干嘛 总体功能一图概述优势小总结 三、Redis的下载与安装 Redis的安装Redis迭代演化和Redis7新特性新特性部分说明Redis的安装 安装步骤总结 Redis的卸载 一、redis官网 https://redis.io/ 中文官网&#xff1a;http://www.red…

首次使用WordPress建站的经验分享(一)

之前用过几种内容管理系统(CMS),如:dedeCMS、phpCMS、aspCMS,主要是为了前端独立建站,达到预期的效果,还是需要一定的代码基础的,至少要有HTML、Css、Jquery基础。 据说WordPress 是全球最流行的内容管理系统CMS,从现在开始记录一下使用WordPress 独立建站的步骤 选购…

spring结合mybatis多租户实现单库分表

实现单库分表 思路&#xff1a;student表数据量大&#xff0c;所以将其进行分表处理。一共有三个分表&#xff0c;分别是student0&#xff0c;student1&#xff0c;student2&#xff0c;在新增数据的时候&#xff0c;根据请求头中的meta-tenant参数决定数据存在哪张表表。 数…

Spring Boot集成Spring Security之HTTP请求授权

一、HTTP请求授权工作原理 ​ 基于Spring Security最新的Http请求授权讲解&#xff0c;不再使用旧版的请求授权 授权过滤器AuthorizationFilter获取认证信息 调用RequestMatcherDelegatingAuthorizationManager的check方法验证该用户是否具有该请求的授权 RequestMatcherDele…