Spring 和 Spring Boot 平时天天用,但它们的来历——为什么会有 Spring、为什么后来又要有 Spring Boot、两者到底是什么关系——这些背景一直没系统梳理过。这篇按历史线捋一遍,把"普通 Spring"和"Spring Boot"的区别讲清楚,也是理解《Spring Boot 自动配置原理》的前提。
一、为什么会有 Spring:为了摆脱 EJB 的笨重
2000 年代初,Java 企业开发的主流是 J2EE + EJB(Enterprise JavaBeans)。EJB 有多难用,现在的开发者很难想象:
- 写一个 Bean,要继承一堆接口、实现一堆生命周期方法(
ejbCreate、ejbActivate...) - 必须部署到笨重的应用服务器(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"的痛点:
<!-- 早期 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)。它用三样东西解决配置地狱:
- 自动配置(AutoConfiguration):扫描 classpath,引入了什么依赖就自动配好什么
- 起步依赖(starter):
spring-boot-starter-web一个依赖顶过去十几个 - 内嵌服务器:内嵌 Tomcat,
java -jar直接跑,不用再部署 war 包
四、关系总结
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 的那颗"心脏"。
