• bean生命周期


    Spring框架中Bean的生命周期包括以下几个核心阶段:

    1. 实例化(Instantiation)
      当Spring容器需要创建一个Bean时,它会根据BeanDefinition中的配置信息调用相应的构造函数来创建Bean对象。对于Singleton作用域的Bean,只会在第一次请求时进行实例化。

    2. 依赖注入(Dependency Injection, DI)
      在Bean被实例化后,Spring容器会根据BeanDefinition中的属性设置和依赖关系描述,通过setter方法、构造器参数等方式将其他Bean注入到当前Bean中。

    3. 初始化前回调(Initialization Callbacks Before Initialization)

      • 如果Bean实现了org.springframework.beans.factory.config.BeanPostProcessor接口,那么其postProcessBeforeInitialization(Object bean, String beanName)方法将在初始化之前被调用。
      • 同样,如果Bean实现了InitializingBean接口,那么其afterPropertiesSet()方法也会在所有必需的属性设置完成后、初始化方法执行前调用。
    4. 初始化(Initialization)
      Spring允许通过以下两种方式之一执行初始化逻辑:

      • 如果Bean类上存在@PostConstruct注解的方法,则该方法会被容器自动调用,用于完成初始化工作。
      • 如果Bean定义中定义了init-method属性,指定的初始化方法将会在这个阶段被调用。
    5. 初始化后回调(Initialization Callbacks After Initialization)

      • 类似地,如果Bean实现了BeanPostProcessor接口,那么其postProcessAfterInitialization(Object bean, String beanName)方法将在初始化之后被调用。
    6. 使用期(Service)
      初始化完成后,Bean就处于可用状态,可以被应用程序或其他Bean通过Spring容器获取并使用。

    7. 销毁前回调(Destruction Callbacks Before Destruction)

      • 当Spring容器关闭或决定销毁某个Bean时,如果Bean实现了DisposableBean接口,那么其destroy()方法会被调用。
      • 或者,如果Bean上存在@PreDestroy注解的方法,该方法也会在Bean销毁前被调用。
      • 此外,也可以通过destroy-method属性在Bean定义中声明自定义的销毁方法。
    8. 销毁(Destruction)
      容器释放Bean占用的资源,如关闭数据库连接、清理临时文件等,并从容器管理的对象缓存中移除Bean实例(对于单例作用域)。

    简而言之,Spring Bean的生命周期涵盖了从创建实例、处理依赖、初始化至最终销毁的所有过程,允许开发者在各个关键点自定义行为以满足特定需求。

    注意:在Spring框架中,初始化阶段与依赖注入密切相关,但这两个概念并不完全等同。生命周期中的各个阶段是相对独立且顺序进行的:

    1. 依赖注入(DI)
      在Bean实例化之后,Spring容器会根据BeanDefinition中的配置信息,将其他Bean作为属性通过构造器注入、setter方法注入或其他方式注入到当前Bean中。这是为了建立对象间的依赖关系,并确保Bean具有完整的服务能力。

    2. 初始化(Initialization)
      依赖注入完成后,初始化阶段开始。这个阶段通常包括对Bean进行进一步的设置以使其达到可使用状态,如调用由@PostConstruct注解标记的方法或实现InitializingBean接口后定义的afterPropertiesSet()方法。这里的“初始化”更多指的是那些由开发者自定义的、在依赖注入之后需要执行的一些逻辑,这些逻辑可能包括但不限于数据校验、资源初始化、额外属性赋值等。

    虽然从广义上讲,依赖注入也可以看作是初始化的一部分,但在Spring Bean的生命周期中,它们被明确地划分为两个不同的步骤,这是因为依赖注入主要关注的是组件之间的依赖装配,而初始化则更偏向于单个组件内部的状态准备和就绪确认。

  • 相关阅读:
    GPT系列论文解读:GPT-1
    Arc length
    通俗易懂介绍mysql索引为什么使用B+树?
    慢 SQL 优化之索引的作用是什么?
    DolphinDB 历史数据回放功能应用:股票行情回放
    计算机毕业设计django基于python在线古诗词学习系统
    python--利用os模块读取指定目录下所有文件名
    纯CSS3流光边框特效
    在Winform开发中,使用Async-Awati异步任务处理代替BackgroundWorker
    Linux安装tomcat(附带安装包)
  • 原文地址:https://www.cnblogs.com/XiaYu-Ye/p/18055563