Spring Bean:不只是“对象”那么简单
你一定见过这样的代码:
@RestController
public class UserController {@Autowiredprivate UserService userService; // ← 这个 userService 是什么?
}
这个 userService
是谁创建的?为什么不用 new
?它从哪里来?为什么可以“自动注入”?
答案就是:它是一个 Spring Bean。但,到底什么是 Spring Bean?
Spring Bean 是由 Spring 容器创建、管理、装配和生命周期控制的 Java 对象。
换句话说:
- 它是一个普通的 Java 对象(POJO)
- 但它“归 Spring 管”
- Spring 负责它的 创建、依赖注入、初始化、销毁
Spring Bean 的核心特征
特征 | 说明 |
---|---|
✅ 由 Spring 容器创建 | 不用 new ,Spring 自动实例化 |
✅ 受 Spring 管理 | 生命周期(初始化、销毁)由 Spring 控制 |
✅ 支持依赖注入(DI) | 自动注入它需要的其他 Bean |
✅ 可配置 | 通过 XML、注解、Java Config 定义 |
✅ 有作用域 | 单例、原型、请求级等 |
Bean 是怎么“注册”到 Spring 中的?
Spring 如何知道哪些类要变成 Bean?有三种方式:
1. 注解方式(最常用)
@Component // 通用组件
@Service // 业务逻辑层
@Repository // 数据访问层
@Controller // 控制器
@RestController // REST 控制器(Spring Boot)
只要类上有这些注解,并被组件扫描(@ComponentScan
)扫到,就会成为 Bean。
@Service
public class UserService {public void saveUser() { ... }
}
2. Java Config 方式(推荐)
@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserService();}
}
@Bean
方法的返回值就是一个 Bean。
3. XML 配置(老项目)
<bean id="userService" class="com.example.UserService"/>
💡现在主流是注解 + Java Config。
Bean 的作用域(Scope)
一个 Bean 不一定只有一个实例。Spring 支持多种作用域:
Scope | 说明 | 使用场景 |
---|---|---|
singleton (默认) | 每个容器只有一个实例 | 大多数 Service、DAO |
prototype | 每次获取都创建新实例 | 需要独立状态的对象 |
request | 每个 HTTP 请求一个实例 | Web 请求处理 |
session | 每个用户会话一个实例 | 用户登录状态 |
application | ServletContext 级别 | 全局配置 |