1. Spring Bean管理核心机制解析
在Spring框架中,Bean管理就像是一个高度智能的物件管理员,它负责创建、组装和管理应用中的所有组件对象。想象你有一个大型工厂,Spring容器就是这个工厂的中央调度系统,它知道每个零件(Bean)应该如何生产、何时生产以及如何将它们组装成完整产品。
Spring通过两种主要方式管理Bean生命周期:
- BeanDefinition注册阶段:相当于给工厂提交零件设计图纸
- 依赖注入阶段:相当于按照图纸说明把零件组装成完整机器
我常用这个类比向团队新人解释:传统的new操作符就像手工打造每个零件,而Spring容器则是自动化生产线,你只需要告诉它"我需要什么"和"怎么组装",它就能按需交付成品。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 依赖注入的三种实现方式对比
2.1 构造器注入(推荐做法)
java复制@Service
public class OrderService {
private final PaymentGateway paymentGateway;
@Autowired
public OrderService(PaymentGateway paymentGateway) {
this.paymentGateway = paymentGateway;
}
}
这种方式的优势在于:
- 依赖项被声明为final,确保线程安全
- 明确表达了类运行所需的必要依赖
- 方便进行单元测试(无需反射工具)
重要提示:在Spring 4.3+版本中,单个构造器的@Autowired可以省略
2.2 Setter注入
java复制@Controller
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
}
适用场景:
- 可选依赖项(类可以正常工作而不需要该依赖)
- 需要动态重新配置的依赖
2.3 字段注入(不推荐)
java复制@Repository
public class ProductDao {
@Autowired
private DataSource dataSource;
}
虽然写法简洁,但存在明显问题:
- 难以进行单元测试(必须使用反射)
- 隐藏了类依赖关系
- 无法声明final字段
3. Bean作用域深度解析
Spring提供了六种不同的Bean作用域,就像给对象分配不同的"寿命卡":
| 作用域类型 | 说明 | 典型应用场景 |
|---|---|---|
| singleton | 单个实例(默认) | 无状态服务、工具类 |
| prototype | 每次请求新实例 | 有状态处理器 |
| request | 单个HTTP请求生命周期 | Web请求处理器 |
| session | 用户会话生命周期 | 用户购物车 |
| application | ServletContext生命周期 | 全局缓存 |
| websocket | WebSocket会话生命周期 | 实时消息处理器 |
实际项目中,90%的Bean使用默认singleton作用域就够了。但在使用其他作用域时要注意:
- prot
