---
date: 2025-2-19 12:49:58
---

# Spring Bean 生命周期

Spring Bean 的生命周期是指从 Bean 的创建到销毁的整个过程。Spring 容器负责管理 Bean 的生命周期，开发者可以通过配置或实现特定接口来干预 Bean 的生命周期。以下是 Spring Bean 生命周期的详细过程：

### 1. **Bean 的实例化（Instantiation）**
+ Spring 容器根据配置（如 XML、注解或 Java 配置）创建 Bean 的实例。
+ 实例化方式：
    - 通过构造函数创建。
    - 通过工厂方法创建。

### 2. **属性赋值（Populate Properties）**
+ Spring 容器根据配置为 Bean 的属性注入值（依赖注入）。
+ 注入方式：
    - 通过 `@Autowired`、`@Resource` 或 `@Value` 注解。
    - 通过 XML 配置中的 `<property>` 标签。

### 3. **BeanNameAware 和 BeanFactoryAware 接口的回调**
+ 如果 Bean 实现了 `BeanNameAware` 接口，Spring 会调用 `setBeanName()` 方法，传入 Bean 的名称。
+ 如果 Bean 实现了 `BeanFactoryAware` 接口，Spring 会调用 `setBeanFactory()` 方法，传入 BeanFactory 实例。

### 4. **BeanPostProcessor 的前置处理**
+ 如果容器中注册了 `BeanPostProcessor`，Spring 会调用其 `postProcessBeforeInitialization()` 方法，对 Bean 进行前置处理。

### 5. **InitializingBean 和 init-method 的调用**
+ 如果 Bean 实现了 `InitializingBean` 接口，Spring 会调用其 `afterPropertiesSet()` 方法。
+ 如果 Bean 配置了 `init-method`（通过 XML 或 `@Bean(initMethod = "init")`），Spring 会调用指定的初始化方法。

### 6. **BeanPostProcessor 的后置处理**
+ 如果容器中注册了 `BeanPostProcessor`，Spring 会调用其 `postProcessAfterInitialization()` 方法，对 Bean 进行后置处理。

### 7. **Bean 的使用**
+ 此时 Bean 已经初始化完成，可以被应用程序使用。

### 8. **DisposableBean 和 destroy-method 的调用**
+ 当容器关闭时，如果 Bean 实现了 `DisposableBean` 接口，Spring 会调用其 `destroy()` 方法。
+ 如果 Bean 配置了 `destroy-method`（通过 XML 或 `@Bean(destroyMethod = "destroy")`），Spring 会调用指定的销毁方法。

#### `BeanPostProcessor` 和 `BeanFactoryPostProcessor` 的区别是什么？

- `BeanPostProcessor` 作用于 Bean 的初始化前后，而 `BeanFactoryPostProcessor` 作用于 BeanFactory 的初始化阶段，用于修改 Bean 的定义。

#### `@PostConstruct` 和 `init-method` 的执行顺序是什么？

- `@PostConstruct` 注解的方法会先执行，然后是 `InitializingBean` 的 `afterPropertiesSet()` 方法，最后是 `init-method`。

#### 如何自定义 Bean 的生命周期？

- 可以通过实现 `InitializingBean`、`DisposableBean` 接口，或者配置 `init-method` 和 `destroy-method`，也可以使用 `BeanPostProcessor` 进行扩展。

### 总结：Bean 生命周期的关键步骤

1. 实例化 Bean。
2. 属性赋值（依赖注入）。
3. 调用 `BeanNameAware` 和 `BeanFactoryAware` 接口的方法。
4. 调用 `BeanPostProcessor` 的 `postProcessBeforeInitialization()` 方法。
5. 调用 `InitializingBean` 的 `afterPropertiesSet()` 方法和自定义的 `init-method`。
6. 调用 `BeanPostProcessor` 的 `postProcessAfterInitialization()` 方法。
7. Bean 准备就绪，可以被使用。
8. 容器关闭时，调用 `DisposableBean` 的 `destroy()` 方法和自定义的 `destroy-method`。



