Spring 容器是 管理 Bean 的核心机制,它的主要职责是:
- 创建 Bean:根据配置或注解实例化 Bean 对象。
- 注入依赖:将 Bean 所需的依赖(其他对象或资源)注入到它们中。
- 管理生命周期:从 Bean 的创建到销毁,全程由容器接管。
以下是对容器和 Bean 关系的详细解析:
1.1 容器是 Bean 的“工厂”
什么是容器?
- 容器是 Spring IoC(控制反转)的实现,它本质上是一个运行时的管理器,主要通过
BeanFactory
或ApplicationContext
实现。 - 容器通过解析配置(XML、注解或 Java 配置类)来定义 Bean,并管理这些 Bean 的生命周期和依赖。
什么是 Bean?
- Bean 是由 Spring 容器管理的对象。
- 它通常是应用程序中的核心组件,比如服务类、控制器类、DAO 类等。
1.2 容器的核心功能
(1) 实例化 Bean:根据定义创建对象
Spring 容器根据配置或注解创建 Bean 的实例:
- 通过构造器创建 Bean:
- 容器调用类的构造方法生成 Bean。
- 通过工厂方法创建 Bean:
- 容器调用静态工厂方法或实例工厂方法创建对象。
示例:构造器实例化
@Component
public class UserService {
public UserService() {
System.out.println("UserService created!");
}
}
通过容器获取 Bean
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
输出:
UserService created!
(2) 注入依赖:解决对象之间的依赖关系
依赖注入(DI) 是 Spring 容器的核心功能之一。
- 容器在创建 Bean 时,会根据其依赖关系,将所需的对象注入到 Bean 中。
- 常见依赖注入方式:
- 构造器注入:通过构造方法注入依赖。
- Setter 注入:通过 Setter 方法注入依赖。
- 字段注入:直接在字段上注入依赖。
示例:构造器注入依赖
@Component
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
}
当容器实例化 UserController
时:
- 先创建
UserService
。 - 再将
UserService
注入到UserController
。
(3) 管理生命周期:控制 Bean 的初始化、使用和销毁过程
Spring 容器负责管理 Bean 的整个生命周期:
- 加载 Bean 定义:
- 从 XML、注解或 Java 配置中加载 Bean 定义。
- 实例化 Bean:
- 调用构造器或工厂方法创建 Bean 对象。
- 注入依赖:
- 解析并注入 Bean 的依赖项。
- 初始化 Bean:
- 如果 Bean 定义了初始化方法(如
@PostConstruct
或init-method
),容器会调用这些方法。
- 如果 Bean 定义了初始化方法(如
- 使用 Bean:
- Bean 准备就绪,可以通过容器获取并使用。
- 销毁 Bean:
- 当容器关闭时,调用销毁方法(如
@PreDestroy
或destroy-method
)。
- 当容器关闭时,调用销毁方法(如
示例:生命周期回调
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("Bean initialized");
}
@PreDestroy
public void destroy() {
System.out.println("Bean destroyed");
}
}
输出:
Bean initialized
(容器关闭时)
Bean destroyed
1.3 容器和 Bean 的协作机制
-
容器管理:
容器全权负责 Bean 的创建、依赖注入、初始化和销毁。 -
开发者的职责:
开发者只需要定义好 Bean 的职责和依赖,容器会自动接管它们的管理。
图示关系:
Spring 容器
├── Bean1(UserController)
├── Bean2(UserService)
├── Bean3(OrderRepository)
└── 依赖注入、作用范围、生命周期全由容器管理
1.4 容器与 Bean 的优点
- 解耦:
- 开发者不需要显式创建和管理对象,容器通过依赖注入实现松耦合。
- 集中管理:
- 所有 Bean 的生命周期和依赖关系由容器统一管理,方便维护和调试。
- 灵活性:
- 容器支持多种配置方式(XML、注解、Java 配置),可以轻松扩展和调整。
- 功能增强:
- 容器支持 AOP(面向切面编程)、事件传播等高级功能。
1.5 总结
- Spring 容器: 是管理 Bean 的“工厂”,负责创建、配置、注入依赖和销毁 Bean。
- 核心功能:
- 创建 Bean 实例。
- 注入依赖以解决对象之间的协作。
- 全程管理 Bean 的生命周期。
- 意义: Spring 容器通过解耦和集中管理,为开发者提供了一个高效、灵活的开发环境,让我们可以专注于业务逻辑,而无需手动管理对象和依赖。