Spring 核心
约 790 字大约 3 分钟
布欧-Lewyon
2026-05-16
首页 › Java › Spring › Spring 核心
Spring 框架的核心是控制反转(IoC) 容器,它管理对象的创建与生命周期,并通过依赖注入(DI) 将对象间的依赖关系交给容器组装,降低耦合。
IoC 与 DI 的概念
public class OrderService {
// 传统方式:主动创建依赖
private final PaymentService paymentService = new PaymentService();
// DI 方式:由容器注入
private final PaymentService paymentService;
public OrderService(PaymentService paymentService) { // 构造器注入
this.paymentService = paymentService;
}
}IoC:控制权从应用代码转移到容器——不再由自己 new,而是由容器创建并管理。 DI:容器在创建 Bean 时将其所需的依赖组装进去。
配置方式
Spring 支持三种 Bean 定义方式,现代项目主要使用注解 + Java Config。
XML 配置(历史方式)
<bean id="orderService" class="com.example.OrderService">
<constructor-arg ref="paymentService"/>
</bean>
<bean id="paymentService" class="com.example.PaymentService"/>Java Config(推荐)
@Configuration
public class AppConfig {
@Bean
public PaymentService paymentService() {
return new PaymentService();
}
@Bean
public OrderService orderService() {
return new OrderService(paymentService());
}
}注解 + 组件扫描(最常用)
@Component
public class PaymentService {
public void pay(double amount) {
System.out.println("支付: " + amount);
}
}
@Service // 语义化 @Component 衍生注解
public class OrderService {
private final PaymentService paymentService;
@Autowired // 告诉 Spring 需要注入
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}启动类:
@Configuration
@ComponentScan("com.example")
public class AppConfig { }
// 或直接用 Spring Boot 的 @SpringBootApplication依赖注入方式
| 方式 | 示例 | 适用场景 |
|---|---|---|
| 构造器注入 | @Autowired public Xxx(Xxx xxx) | 首选,保证不可变与不可为空 |
| Setter 注入 | @Autowired public void setXxx(Xxx xxx) | 可选依赖,或需要重新配置 |
| 字段注入 | @Autowired private Xxx xxx | 简单场景,但不利于测试和不可变性 |
官方推荐构造器注入:字段用 final 保证不变,且构造时明确知道所有依赖。
Bean 作用域
| 作用域 | 含义 | 典型场景 |
|---|---|---|
singleton(默认) | 整个容器只有一个实例 | 无状态的 Service、DAO |
prototype | 每次获取创建一个新实例 | 有状态的对象 |
request | 每次 HTTP 请求一个实例 | Web 应用中的请求上下文 |
session | 每个 HTTP Session 一个实例 | 用户会话信息 |
@Component
@Scope("prototype")
public class ShoppingCart { ... }条件装配
@Profile 和 @Conditional 根据环境条件决定是否创建 Bean:
@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
return new H2DataSource();
}
@Bean
@Profile("prod")
public DataSource prodDataSource() {
return new MysqlDataSource();
}
}小结
- IoC/DI 将对象创建交给 Spring 容器,降低耦合,提升可测试性。
- 配置方式:XML(旧)→ Java Config(
@Bean)→ 注解扫描(@Component/@Service+@Autowired)。 - 优先使用构造器注入,字段
final,依赖关系明确。 - Bean 默认
singleton,无状态服务使用默认作用域即可;有状态考虑prototype。 - 易错:
@Autowired在构造器注入上可省略(Spring 4.3+,如果类只有一个构造器)。循环依赖(A → B → A)在构造器注入下直接报错,而字段注入可以通过三级缓存绕过去——但这掩盖了设计问题,应重构代码消除循环。 - 思考任务:创建一个
@Configuration类定义两个@Bean(DataSource和JdbcTemplate),创建UserRepository用构造器注入JdbcTemplate,手动从AnnotationConfigApplicationContext获取 Bean 验证注入是否成功。
上一节:Spring 概述
下一节:Spring MVC
