Skip to content

Spring 和 Spring Boot 平时天天用,但它们的来历——为什么会有 Spring、为什么后来又要有 Spring Boot、两者到底是什么关系——这些背景一直没系统梳理过。这篇按历史线捋一遍,把"普通 Spring"和"Spring Boot"的区别讲清楚,也是理解《Spring Boot 自动配置原理》的前提。

一、为什么会有 Spring:为了摆脱 EJB 的笨重

2000 年代初,Java 企业开发的主流是 J2EE + EJB(Enterprise JavaBeans)。EJB 有多难用,现在的开发者很难想象:

  • 写一个 Bean,要继承一堆接口、实现一堆生命周期方法(ejbCreateejbActivate...)
  • 必须部署到笨重的应用服务器(WebLogic、WebSphere,贵且慢)
  • 配置全靠 XML 描述符,改一点要重启半天
  • 单元测试几乎没法做(依赖容器才能跑)

2002 年,Rod Johnson 写了《Expert One-on-One J2EE Design and Development》,书里痛批 EJB 的复杂度,并随书附了一个轻量级替代框架(几万行代码)。2003 年这个框架开源,就是 Spring Framework

它的核心思想两条:

  • IoC(控制反转 / 依赖注入):对象的创建和依赖关系交给容器管理,不用自己 new
  • AOP(面向切面编程):事务、日志这类横切逻辑,用切面统一织入

最关键的卖点是轻量:不依赖应用服务器,一个普通 Tomcat 就能跑。

二、为什么还有"普通 Spring":它功能强,但配置是地狱

Spring Framework 很好,但用起来极其繁琐——这就是"普通 Spring"的痛点:

xml
<!-- 早期 Spring 要手写大量这种配置 -->
<bean id="dataSource" class="...DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</bean>
<bean id="sessionFactory" class="...LocalSessionFactoryBean">...</bean>
<bean id="transactionManager" class="...">...</bean>

集成 Spring MVC、MyBatis、事务,全都要手动配一堆 Bean。开发者一半时间在写配置,而不是写业务。所以"普通 Spring"= 强大但门槛高、配置繁琐。

三、Spring Boot 的来历:把配置自动化

2014 年,Pivotal 团队发布 Spring Boot,核心就一句话——约定优于配置(Convention over Configuration)。它用三样东西解决配置地狱:

  1. 自动配置(AutoConfiguration):扫描 classpath,引入了什么依赖就自动配好什么
  2. 起步依赖(starter)spring-boot-starter-web 一个依赖顶过去十几个
  3. 内嵌服务器:内嵌 Tomcat,java -jar 直接跑,不用再部署 war 包

Spring 生态演进:EJB 笨重 → Spring Framework 轻量替代 → Spring Boot 自动配置

四、关系总结

Spring Boot 不是"替代"Spring,而是"用 Spring 的更好方式"

Spring Boot = Spring Framework + 自动配置 + 起步依赖 + 内嵌服务器
              (内核/地基)      (把配置自动化)

Spring Framework 是地基,Spring Boot 是盖在地基上的"精装房"——内核还是那个 IoC/AOP,只是把繁琐的配置自动化了。

所以"普通 Spring"和"Spring Boot"的区别,本质是 "手动配置" vs "自动配置" 的区别,而不是两个不同的框架。

小结

  • Spring 2003 年诞生,用 IoC + AOP 轻量级替代笨重的 EJB
  • "普通 Spring"功能强但配置繁琐,开发者一半时间在写配置
  • Spring Boot 2014 年诞生,用自动配置 + 起步依赖 + 内嵌服务器解决配置地狱
  • 关系:Spring Boot 不是替代 Spring,是"用 Spring 的更好方式",底层还是 Spring

自动配置到底怎么"自动"的?接着看《Spring Boot 自动配置原理》——它讲 @SpringBootApplication 三合一、条件注解、AutoConfiguration.imports 注册机制,就是 Spring Boot 区别于普通 Spring 的那颗"心脏"。