首页 > 其他分享 >bean生命周期

bean生命周期

时间:2024-03-05 23:44:57浏览次数:15  
标签:初始化 生命周期 Spring 调用 Bean 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的生命周期中,它们被明确地划分为两个不同的步骤,这是因为依赖注入主要关注的是组件之间的依赖装配,而初始化则更偏向于单个组件内部的状态准备和就绪确认。

标签:初始化,生命周期,Spring,调用,Bean,bean,依赖,方法
From: https://www.cnblogs.com/XiaYu-Ye/p/18055563

相关文章

  • FactoryBean接口的使用
    一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在标签中提供大量的配置信息,配置方式的灵活性是受限的。为此,spring可以通过实现FactoryBean的接口来定制实例化bean的逻辑。1创建User对象......
  • 3_基于注解管理Bean对象
    基于注解管理Bean对象1.基本介绍Spring通过注解实现自动装配的步骤如下:引入依赖开启组件扫描使用注解定义Bean依赖注入Spring默认不使用注解配置bean,因此需要我们在Spring的配置文件中配置context:component-scan元素开启SpringBeans的自动扫描功能。开启此功能后,Sprin......
  • Vue学习笔记33-生命周期
    示例一: <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>引入生命周期</title>......
  • 4 类的生命周期
    4类的生命周期​ 类的生命周期描述了一个类加载、使用、卸载的整个过程​ 类的生命周期包括五个阶段:加载、连接、初始化、使用、卸载加载加载阶段第一步是类加载器根据类的全限定名通过不同的渠道(本地文件、动态代理生成等)以二进制流的方式获取字节码信息类加载器在加载......
  • BeanShell PostProcessor 后置处理器1
    一概念:作用类似于后置处理器,其中的ctx、vars、props、prev、log都和BeanShellSampler一样一样![image.png](https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/16194/1663307082040/f1a46708c4ae40229e892abaf6985a72.png)重点解释前面没有的:**data:......
  • BeanShell PostProcessor 后置处理器
    一主要作用:   BeanShellPostProcessor主要用来提取响应数据,对数据做处理分析的。二概念:  作用类似于后置处理器,其中的ctx、vars、props、prev、log都和BeanShellSampler一样一样  ![image.png](https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote......
  • UE5 Gameplay一些类的生命周期备忘
    作为一个初学者,尽管能够在UE中能够使用蓝图和简单在C++中做一些逻辑更改,但对 Gameplay框架的使用上还是一脸懵逼,比如:玩家的本地数据存在哪里?游戏的数据存在哪?如果我切换了关卡,放在哪的数据会丢?如果玩家死亡了,放在哪的数据会丢?如果我想要存储一个全局数......
  • 乖乖,咱不用BeanUtil.copy了,咱试试这款神级工具(超详细)
    引言在现代Java应用程序开发中,处理对象之间的映射是一个常见而且必不可少的任务。随着项目规模的增长,手动编写繁琐的映射代码不仅耗时且容易出错,因此开发者们一直在寻找更高效的解决方案。比如基于Dozer封装的或者Spring自带的BeanUtil.copyProperties对应对象之间的属性拷贝。但......
  • JAVA面向对象基础:封装,实体JavaBean
     封装: 封装设计对象规范:合理隐藏,合理暴露 即类中使用的public与private关键字合理使用(只暴露对对象数据操作的方法,不暴露数据,故在对象中用private来封装数据,用public来封装方法)将成员变量保护起来,将get与set方法暴露出来供相关操作。将需要外界访问的成员方法用public,不......
  • springframework BeanUtils 复制java对象属性值 copyProperties
    importorg.springframework.beans.BeanUtils;importorg.springframework.beans.BeanWrapper;importorg.springframework.beans.BeanWrapperImpl;importjava.beans.PropertyDescriptor;importjava.util.HashSet;importjava.util.Set;/***ObjectBeanUtils*......