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

1. 定位与目标

Spring Framework

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

开发痛点

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

Spring Boot

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

Starter 示例

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

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

自动配置示例

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

  • EntityManagerFactory
  • JpaTransactionManager

2. 核心差异

3. 代码示例对比

1. Spring 开发流程

步骤 1:手动添加 Maven 依赖

xml 复制代码
<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、事务管理器、视图解析器等。

xml 复制代码
<!-- 手动配置 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:代码编写 → 冗余的模板配置

xml 复制代码
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 → 极简配置

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update

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

java 复制代码
@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

java 复制代码
@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.如何选择?

适用场景对比

技术选型决策树

txt 复制代码
是否需要快速启动项目?  
   ├── 是 → 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,启动时打印已启用的自动配置类。
  • 排除不需要的自动配置
java 复制代码
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication { ... }

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

总结

  • Spring 是基础:如汽车发动机,需要自行组装零件(手动配置)才能行驶。
  • Spring Boot 是完整车型:提供自动挡、导航系统(自动配置),适合快速上路。
  • 关联性:Spring Boot ≠ 取代 Spring,而是基于 Spring 构建的"开发者友好层"。
相关推荐
web13688565871几秒前
PHP For 循环
android·java·php
loyd315 分钟前
【数据分析】5 设计不同业务分析框架
java·网络·数据分析
web_1553427465618 分钟前
Spring Boot(十六):使用 Jenkins 部署 Spring Boot
spring boot·后端·jenkins
m0_7482451721 分钟前
Spring Boot项目开发常见问题及解决方案(上)
java·spring boot·后端
今天的接口写完了吗?22 分钟前
Spring Boot操作MaxComputer(保姆级教程)
java·spring boot·后端
金州小铁匠35 分钟前
基于EasyExcel封装的Excel工具类,支持高效导出和读取操作
java·spring·excel
IIIIIIlllii38 分钟前
java练习(43)
java·开发语言
xxxxxmy1 小时前
Spring MVC 程序开发(1)
java·spring·mvc
不平衡的叉叉树1 小时前
使用优化版的编辑距离算法替代ES默认的评分算法
java·算法
没什么技术1 小时前
Spock框架:让单元测试更优雅的高效武器
java·spock