Skip to content

Spring 概述

  Spring 是 Java 企业级开发的基石。2003 年 Rod Johnson 写了一本《Expert One-on-One J2EE Design and Development》,批评当时的 EJB 过于臃肿,并给出了一个轻量级替代方案——这就是 Spring 的雏形。

一、Spring 发展史

2003  Spring Framework 诞生    → 解决 EJB 过于臃肿的问题
2004  Spring 1.0              → IoC + AOP 核心
2006  Spring 2.0              → 注解驱动、命名空间配置
2009  Spring 3.0              → JavaConfig、@Configuration
2013  Spring 4.0              → Java 8 支持、@RestController
2014  Spring Boot 1.0         → 约定优于配置,自动配置
2017  Spring 5.0              → 响应式编程(WebFlux)
2018  Spring Boot 2.0         → Java 8+ 基线、WebFlux 成熟
2022  Spring Boot 3.0 / Spring 6.0 → Jakarta EE、GraalVM 原生镜像、AOT 编译
2024  Spring Boot 3.3+        → 持续演进,CDS 支持

二、Spring 生态全景

Spring 全家桶:

  ┌─────────────────────────────────────────────────────────────┐
  │                    Spring Framework(核心)                   │
  │  IoC 容器 │ AOP │ 数据访问 │ Web │ 事务 │ 事件 │ 表达式      │
  └──────────────────────┬──────────────────────────────────────┘

     ┌───────────────────┼───────────────────┐
     │                   │                   │
     ▼                   ▼                   ▼
  Spring Boot        Spring Cloud        Spring Data
  (快速开发)        (微服务治理)        (数据访问层)
     │                   │                   │
     ├─ 自动配置          ├─ Gateway           ├─ JPA
     ├─ 起步依赖          ├─ OpenFeign         ├─ JDBC
     ├─ Actuator          ├─ LoadBalancer      ├─ Redis
     ├─ 外部化配置        ├─ Config            ├─ MongoDB
     └─ 嵌入式容器        └─ ...               └─ ...

三、Spring 核心设计哲学

3.1 三大核心理念

① 轻量级
  不强制依赖 Spring 的 API,POJO 即可运行在 Spring 容器中
  你的业务代码不需要 import Spring 的类

② 非侵入式
  Spring 不要求你的类继承它的基类或实现它的接口
  一个普通的 Java 类,加了 @Component 就能被 Spring 管理

③ 模块化
  Spring 由 20+ 个模块组成,按需引入
  不需要 Spring MVC 就不引入 spring-webmvc

3.2 两大核心思想

IoC(Inversion of Control,控制反转):
  把"创建对象"的控制权从代码中交给 Spring 容器
  原来:new Service() → 代码控制
  现在:@Autowired Service → 容器控制

AOP(Aspect Oriented Programming,面向切面编程):
  把横切关注点(日志、事务、权限)从业务代码中抽离出来
  原来:每个方法里写 log.info("开始执行")
  现在:一个切面搞定所有方法的日志

四、Spring 解决了什么问题

没有 Spring 的时代:

  public class OrderService {
      private OrderDao orderDao = new OrderDaoImpl();  // 硬编码
      private InventoryDao inventoryDao = new InventoryDaoImpl();
      // 换一个实现需要改代码
  }


有了 Spring 之后:

  @Service
  public class OrderService {
      @Autowired
      private OrderDao orderDao;     // 自动注入,不关心实现
      @Autowired
      private InventoryDao inventoryDao;
      // 换实现只需改配置,代码零修改
  }
问题Spring 解决方式
对象创建和管理IoC 容器统一管理
对象间依赖关系依赖注入自动装配
代码耦合度高面向接口编程 + DI
横切关注点散落AOP 统一处理
样板代码多模板模式(JdbcTemplate、RestTemplate)
与框架强绑定非侵入式设计,POJO 即可

五、Spring 模块架构

Spring Framework 核心模块:

  spring-core        → 核心工具类、类型转换、序列化
  spring-beans       → Bean 定义、Bean 工厂、属性编辑
  spring-context     → ApplicationContext、事件、国际化
  spring-expression  → SpEL 表达式语言
  spring-aop         → AOP 联盟接口、切面编程
  spring-jdbc        → JDBC 抽象、事务管理
  spring-orm         → Hibernate、JPA 集成
  spring-tx          → 事务抽象层
  spring-web         → Web 基础功能(Servlet 监听器等)
  spring-webmvc      → Spring MVC 框架
  spring-webflux     → 响应式 Web 框架
  spring-test        → 测试支持

六、面试要点

Q1:Spring 是什么?

  Spring 是一个轻量级的、非侵入式的 Java 开发框架,核心是 IoC 容器和 AOP。它提供了一站式的企业级开发解决方案,包括数据访问、事务管理、Web 开发、微服务等。

Q2:Spring 的核心思想是什么?

  IoC(控制反转)和 AOP(面向切面编程)。IoC 把对象创建和管理交给容器,AOP 把横切关注点从业务代码中分离。

Q3:Spring 和 Spring Boot 的区别?

  Spring 是框架,需要手动配置;Spring Boot 是 Spring 的快速开发工具,通过自动配置和起步依赖,让开发者几乎零配置启动项目。