首页 > 其他分享 >Spring Bean的生命周期

Spring Bean的生命周期

时间:2025-01-16 16:31:04浏览次数:3  
标签:初始化 生命周期 Spring bean Bean 调用 afterPropertiesSet

概述:

        Spring的Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。一个bean的生命周期主要是4个步骤, 实例化,属性注入,初始化,销毁,但是对于一些复杂的bean的创建,Spring会在Bean的生命周期中开放很多的接口,能够让你加载Bean的时候对Bean做一些改变。在Spring中有一些特殊的Bean会介入到其他Bean的声明周期当中去,所以一个普通的Bean的生命周期为:

  1. 实现了BeanFactoryPostProcessor接口的bean,在加载其他的bean的时候,也会调用这个bean的 postProcessBeanFactory方法,可以在这个步骤去对bean中的属性去赋值。设置年龄初始化为18等。
  2. 实现了InstantiationAwareBeanPostProcessor接口的bean,会在实例化bean之前调用 postProcessBeforeInstantiation方法
  3. 然后再对bean进行实例化
  4. 对bean进行属性注入
  5. 对bean进行初始化,在初始化中,包含了以下几个步骤:                                                                         1. 实现了BeanFactoryAware接口,会先调用setBeanFactory方法                                           2. 实现了BeanNameAware接口,会先调用setBeanName方法                                                 3. 实现了BeanPostProcessor接口,会先调用postProcessBeforeInitialization方法                   4. 实现了InitializingBean接口,会调用afterPropertiesSet方法                                                 5. 然后在进行aop后置处理,通过实现BeanPostProcessor接口,在postProcessAfterInitialization方法中进行动态代理
  6. 销毁

Spring 中Bean的详细生命周期

  1. Spring容器启动,加载并注册Bean定义。
  2. 对于每个Bean定义,Spring容器会进行实例化。
  3. 实例化后,Spring容器会将依赖注入Bean的属性中。
  4. 如果Bean实现了BeanNameAware、BeanFactoryAware或ApplicationContextAware接口,Spring容器会调用相应的方法传递相关资源。
  5. 如果Bean实现了BeanPostProcessor接口,Spring容器会调用postProcessBeforeInitialization方法。
  6. 如果Bean实现了InitializingBean接口,Spring容器会调用afterPropertiesSet方法。
  7. 如果Bean定义了初始化方法(如通过@PostConstruct注解或init-method属性),Spring容器会调用该方法。
  8. 如果Bean实现了BeanPostProcessor接口,Spring容器会调用postProcessAfterInitialization方法。
  9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
  10. 当容器关闭时,如果bean实现了DisposableBean接口或定义了销毁方法(如通过@PreDestroy注解或destroy-method属性),Spring容器会调用相应的方法进行销毁。

JavaDoc文档中除了以上接口外,另外的初始化过程涉及的接口

org.springframework.beans.factory.BeanFactory 中的创建过程:

BeanNameAware.setBeanName() 在创建此bean的bean工厂中设置bean的名称,在普通属性设置之后调用,在InitializinngBean.afterPropertiesSet()方法之前调用

BeanClassLoaderAware.setBeanClassLoader(): 在普通属性设置之后,InitializingBean.afterPropertiesSet()之前调用

BeanFactoryAware.setBeanFactory() : 回调提供了自己的bean实例工厂,在普通属性设置之后,在InitializingBean.afterPropertiesSet()或者自定义初始化方法之前调用

EnvironmentAware.setEnvironment(): 设置environment在组件使用时调用

EmbeddedValueResolverAware.setEmbeddedValueResolver(): 设置StringValueResolver 用来解决嵌入式的值域问题

ResourceLoaderAware.setResourceLoader(): 在普通bean对象之后调用,在afterPropertiesSet 或者自定义的init-method 之前调用,在 ApplicationContextAware 之前调用。

ApplicationEventPublisherAware.setApplicationEventPublisher(): 在普通bean属性之后调用,在初始化调用afterPropertiesSet 或者自定义初始化方法之前调用。在 ApplicationContextAware 之前调用。

MessageSourceAware.setMessageSource(): 在普通bean属性之后调用,在初始化调用afterPropertiesSet 或者自定义初始化方法之前调用,在 ApplicationContextAware 之前调用。

ApplicationContextAware.setApplicationContext(): 在普通Bean对象生成之后调用,在InitializingBean.afterPropertiesSet之前调用或者用户自定义初始化方法之前。在ResourceLoaderAware.setResourceLoader,ApplicationEventPublisherAware.setApplicationEventPublisher,MessageSourceAware之后调用。

ServletContextAware.setServletContext(): 运行时设置ServletContext,在普通bean初始化后调用,在InitializingBean.afterPropertiesSet之前调用,在 ApplicationContextAware 之后调用注入:

BeanPostProcessor.postProcessBeforeInitialization() : 将此BeanPostProcessor 应用于给定的新bean实例 在任何bean初始化回调方法(像是InitializingBean.afterPropertiesSet或者自定义的初始化方法)之前调用。这个bean将要准备填充属性的值。返回的bean示例可能被普通对象包装,默认实现返回是一个bean。

BeanPostProcessor.postProcessAfterInitialization() : 将此BeanPostProcessor 应用于给定的新bean实例 在任何bean初始化回调方法(像是InitializingBean.afterPropertiesSet或者自定义的初始化方法)之后调用。这个bean将要准备填充属性的值。返回的bean示例可能被普通对象包装

InitializingBean.afterPropertiesSet(): 被BeanFactory在设置所有bean属性之后调用(并且满足BeanFactory 和 ApplicationContextAware)。 销毁:

DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(): 在销毁之前将此BeanPostProcessor 应用于给定的bean实例。能够调用自定义回调,像是DisposableBean 的销毁和自定义销毁方法,这个回调仅仅适用于工厂中的单例bean(包括内部bean)

实现了自定义的destory()方法

总结:
        简述Spring Bean 的生命周期:

        1.实例化、属性赋值、初始化、销毁这 4 个大阶段;

        2.初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;

        3.销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁

标签:初始化,生命周期,Spring,bean,Bean,调用,afterPropertiesSet
From: https://blog.csdn.net/2401_83691559/article/details/145061567

相关文章

  • springboot基于Vue在线考试管理系统_3ogiiv49
    收藏关注不迷路!!......
  • 计算机毕业设计—92713 Springboot邻家优选超市线上线下购物系统小程序(源码免费领)
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对邻家优选超......
  • 计算机毕业设计—311017 spring boot酒店预定系统(源码免费领)
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对酒店客房预定等问题,对酒店信息管理进行研究分析,然后开发设计出酒店预订系统以解决问题。......
  • 【开源免费】基于SpringBoot+Vue.JS林业产品推荐系统(JAVA毕业设计)
    本文项目编号T139,文末自助获取源码\color{red}{T139,文末自助获取源码}......
  • Spring注解
    目录Spring注解声明bean的注解注入bean的注解配置类注解@Configuration@Bean@ComponentScan@WishlyConfiguration功能注解配置类相关注解切面(AOP)相关注解校验检查空检查Booelan检查长度检查日期检查数值检查类生命周期注解配置注入@Value为属性注入值,支持如下方式的注入:@PropertyS......
  • spring声明事务和编程式事务
    什么是事务?事务是指对数据库中的数据做出一系列操作,事务具有不可分割性、一致性、隔离性和持久性等特征。在Spring框架中,事务管理支持两种方式:声明式事务和编程式事务。编程式事务是指通过手动编写代码来管理事务的提交和回滚。在Spring框架的早期版本中,就已经提供了编程......
  • 【Solon 框架】使用国产化框架 Solon Cloud Gateway 替换 Spring Gateway
    #国产化框架Solon说明在「使用国产化框架Solon的一些开发经验」中提到,我们只是在平台的一个应用开始使用Solon框架,并非一次性的完全替换。但随着soloncloudgateway官方版本发布,替换SpringGateway也成为可能,于是开始相关的替换工作。我们的网关主要提供了统计授权和......
  • springboot环境下的rokectMQ多数据源实现
    业务原因,需要在一个项目中与多方MQ进行业务通信;步骤一,复制一份RocketMQProperties配置文件,避免与原来的冲突packagecom.heit.road.web.config;importorg.apache.rocketmq.common.topic.TopicValidator;importjava.util.HashMap;importjava.util.Map;publicclassMu......
  • SpringBoot+Redis+消息队列 技术的抢购方案【附有图文+示例代码】
    文章目录SpringBoot+Redis+消息队列技术的抢购方案13.1简单抢购13.2模拟高并下发抢购jmeter工具使用实现13.3数据安全问题加锁synchronized分布式锁13.4消息队列完成抢购【yml配置文件】【实体类】【redis工具类】【队列配置类】【controller】【队列监听器RabbitQM......
  • 创建Spring boot项目的五种方式
    1.idea直接从spring.io官网下载注意maven版本不能太高,使用3.3.9的版本2.Idea从阿里云的官网(https://start.aliyun.com)下载打开17版的idea不支持阿里云,需要使用更高版本的idea3.从spring.io官网(https://start.spring.io/)下载好,用idea打开......