返回

#Spring源码分析(十)Bean实例化(三)#

后端

Spring Bean 实例化:深入剖析 Bean 生命周期的秘密

Bean 实例化后置处理:让 Bean 更加强大

在 Bean 实例化之后,Spring 提供了一系列后置处理器,用于增强和修改 Bean。这些处理器包括:

  • BeanPostProcessor: 通用处理器,可对所有 Bean 进行操作。
  • InstantiationAwareBeanPostProcessor: 可在 Bean 实例化前后的生命周期中进行控制。
  • DestructionAwareBeanPostProcessor: 可在 Bean 销毁前后的生命周期中进行清理。

Bean 实例化流程:揭秘 Bean 的诞生

Spring Bean 的实例化流程包括:

  • 解析 Bean 定义: 容器确定 Bean 的类型、属性和依赖关系。
  • 实例化 Bean: 容器根据 Bean 定义创建 Bean 实例。
  • 设置 Bean 属性: 容器为 Bean 实例设置属性值。
  • 后置处理: 容器调用后置处理器对 Bean 进行修改。
  • 初始化: 容器调用 Bean 的初始化方法,完成初始化。

Spring Bean 生命周期:从诞生到消亡

Bean 的生命周期包括:

  • 定义: 创建、注册和解析 Bean 定义。
  • 实例化: 创建 Bean 实例和进行后置处理。
  • 初始化: 调用初始化方法和完成初始化。
  • 使用: Bean 被应用程序使用。
  • 销毁: 调用销毁方法和进行资源清理。

Spring Bean 容器:Bean 的管理中心

Spring Bean 容器管理 Bean 的创建、配置和销毁。其核心接口是 BeanFactory。

Spring Bean 工厂:Bean 创建背后的推手

BeanFactory 负责创建 Bean 实例。实现包括:

  • DefaultListableBeanFactory: 默认实现,支持 Bean 定义的注册、查找和获取。
  • AutowireCapableBeanFactory: 扩展 DefaultListableBeanFactory,支持自动装配和依赖注入。

Spring Bean 作用域:控制 Bean 的可见性

作用域定义了 Bean 实例的可见范围:

  • Singleton: 单个实例,在整个应用程序中可用。
  • Prototype: 每次请求创建一个新实例。
  • Request: 仅在当前 HTTP 请求中可用。
  • Session: 仅在当前 HTTP 会话中可用。
  • GlobalSession: 在所有 HTTP 会话中可用。

Spring Bean 依赖注入:让 Bean 协同工作

依赖注入将依赖关系注入 Bean 实例,实现方式有:

  • 构造器注入: 通过构造函数注入依赖关系。
  • 属性注入: 通过 Bean 属性注入依赖关系。

Spring Bean 自动装配:自动完成依赖注入

自动装配自动完成依赖注入,方式包括:

  • no: 不自动装配。
  • byName: 根据 Bean 名称自动装配。
  • byType: 根据 Bean 类型自动装配。
  • constructor: 根据构造函数参数类型自动装配。
  • autodetect: 根据名称、类型和构造函数参数自动装配。

代码示例

@Component
public class MyBean {

    // Bean 属性
    private String name;

    // Bean 构造函数
    public MyBean(String name) {
        this.name = name;
    }

    // Bean 初始化方法
    @PostConstruct
    public void init() {
        System.out.println("MyBean 初始化完成!");
    }

    // Bean 销毁方法
    @PreDestroy
    public void destroy() {
        System.out.println("MyBean 销毁完成!");
    }

    // Bean 方法
    public String getName() {
        return name;
    }
}

常见问题解答

1. BeanPostProcessor 的作用是什么?
BeanPostProcessor 可用于自定义 Bean 的行为,如添加额外的属性或验证。

2. Spring 中有哪些类型的 Bean 作用域?
Singleton、Prototype、Request、Session、GlobalSession。

3. 依赖注入和自动装配有何区别?
依赖注入手动设置依赖关系,而自动装配自动完成此操作。

4. Spring Bean 生命周期的阶段是什么?
定义、实例化、初始化、使用、销毁。

5. 如何配置 Spring Bean 的自动装配?
通过在 Bean 配置文件中指定 autowire 属性。