bean的生命周期详解

news/2024/10/18 5:52:28/

bean的生命周期详解

文章内容引用自 咕泡科技 咕泡出品,必属精品

原文链接:Bean的生命周期(不要背了记思想) - 腾讯云开发者社区-腾讯云 (tencent.com)

文章目录

  • bean的生命周期详解
  • 学前必看
  • 创建 bean 的过程
  • bean 的完整生命周期

学前必看

  没有前置知识盲目的去学习 Bean 的生命周期,是没有任何意义的,或者说这只是为了应付面试而学,没有使用场景,没有复习欲望,看完背完你能记多久呢? 一周?一个月? 你大学学的计算机网络你还记得吗?😆

  在学习 Bean 的生命周期之前,你至少应该知道,或者至少了解 Spring IOC 和 DI 以及他们的详细流程、Spring 容器的初始化流程、AOP 的代码织入过程等,有兴趣的还可以学习一下 Spring 是如何解决循环依赖的,以及 Spring 中的一些其他经典代码。等学习完上述知识之后,你就已经对 Spring 有了一个基本还算完善的概念,这时你也知道了一个 Bean 在容器初始化的时候经历了什么,然后再去系统地学习 Bean 完整的生命流程,对照先前学习的知识,查漏补缺。

Tips

  • 学习 Spring 和看 Spring 源码前一定要先学思想!!!

  • 学习 Spring 和看 Spring 源码前一定要先学思想!!!

  • 学习 Spring 和看 Spring 源码前一定要先学思想!!!

 

创建 bean 的过程

你若是真的为面试而来,请把下面这段背下来,应付面试足矣

  简单来说,bean 的生命周期其实指的就是 Spring 创建 bean 的一个过程。这个过程并不复杂,主要有以下四个步骤:实例化、属性注入、初始化,以及最后的销毁。但是对于一些复杂 (例如依赖关系比较复杂) 的 bean ,其创建可能会多一些步骤,因为现实情况中 Spring 会在 bean 的生命周期中开放很多的接口,让我们加载 bean 的时候对 bean 做一些自定义操作 (不过通常情况下我们是用不到的)。

 

   所以在 Spring 中可能有一些特殊的 bean 介入会到其他 bean 的生命周期当中,因此,一个 bean 的完整的生命周期总共有以下几步:

 

  1. 实现了 BeanFactoryPostProcessor 接口的 bean,在加载其他的 bean 的时候,会同时调用 bean 的 postProcessBeanFactory 方法为 bean 的属性赋值、设置年龄、初始化 i18 等等。

  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. 销毁 bean

 

  这里给出一个可以让你们去跟源码一步一步看着点下去的无敌图,悄悄说一句,其实学习 Bean 的生命周期有这个图就足够了,说多了都是虚的。

Bean最长的生命周期

 

本图来自咕泡学院文泰老师,转发请注明出处,否则必究 咕泡出品,必属精品

 

bean 的完整生命周期

  在传统的 Java 应用中,bean的生命周期非常简单命了,使用 Java 关键字 new 进行Bean 的实例化后,该Bean 就能够使用了。一旦 bean 不再被使用,则由 Java 的 GC 自动进行垃圾回收。

  相比之下,Spring 管理 Bean 的生命周期就复杂多了,因为在 Spring 管理下的 bean 的生命周期其可扩展性非常强,正确理解它对我们学习和了解 Spring 框架是非常有帮助的。

Bean的完整生命周期
 

  1. Spring 启动,查找并加载需要被 Spring 管理的 bean,进行 Bean 的实例化
  2. Bean 实例化后对将 Bean 的引入和值注入到 Bean 的属性中
  3. 如果 Bean 实现了 BeanNameAware 接口的话,Spring 将 Bean 的 Id 传递给 setBeanName() 方法
  4. 如果 Bean 实现了 BeanFactoryAware 接口的话,Spring 将调用 setBeanFactory() 方法,将 BeanFactory 容器实例传入
  5. 如果 Bean 实现了 ApplicationContextAware 接口的话,Spring 将调用 Bean 的 setApplicationContext() 方法,引入 bean 的应用上下文。
  6. 如果 Bean 实现了 BeanPostProcessor 接口,Spring 就调用他们的 postProcessBeforeInitialization() 方法。
  7. 如果 Bean 实现了 InitializingBean 接口,Spring 将调用他们的 afterPropertiesSet() 方法。类似地如果 bean 使用 init-method 声明了初始化方法,该方法也会被调用
  8. 如果 Bean 实现了 BeanPostProcessor 接口,Spring 就将调用他们的 postProcessAfterInitialization() 方法。
  9. 此时,Bean 已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
  10. 如果 bean 实现了 DisposableBean 接口,Spring 将调用它的 destory() 接口方法,同样地,如果 bean 使用了 destory-method 声明销毁方法,该方法也会被调用。

 

  上面是 Spring 中 Bean 的核心接口和生命周期,面试回答上述这些已经足够了。但是翻阅 JavaDoc 文档发现除了以上接口外,还有初始化过程涉及的接口,摘自org.springframework.beans.factory.BeanFactory, 全部相关接口如下 (上述已有的就不用着重标注,把额外的相关接口着重标注下):

关于Bean的完整生命周期的其他接口

解释一下上图的一些相关过程:

  • 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.setResourceLoaderApplicationEventPublisherAware.setApplicationEventPublisherMessageSourceAware之后调用。
  • ServletContextAware.setServletContext(): 运行时设置 ServletContext,在普通 bean 初始化后调用,在InitializingBean.afterPropertiesSet 之前调用,在 ApplicationContextAware 之后调用 (注:是在WebApplicationContext 运行时)
  • 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() 方法

 

原文链接:Bean的生命周期(不要背了记思想) - 腾讯云开发者社区-腾讯云 (tencent.com)


http://www.ppmy.cn/news/563015.html

相关文章

Windows中mfc120.dll缺少的解决方法

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个mfc120.dll文件进行安装(前提…

ArtCAM入门简单教程(一)——矢量雕刻

记录过去,奋斗现在,展望未来 (给未来即将结束的工作的存档) ArtCAM入门简单教程 一、矢量雕刻 前言: 菜鸟的教学,介绍最简单、常用的基本功能,希望能帮助方便零基础的人编写简单的数控加工程序。 个人感觉: ArtCAM是英国Delcam公司…

绘图机写单线字,实验报告不用自己写啦

使用绘图机来写单线字 0x00:安装驱动及调试硬件 CH341SER.EXE安装硬件组装及连接舵机和步进电机到控制板(连接线路时不要连接数据线和电源,连接方法详情见资料包)。 安装微雕管家,连接数据线。 0x01:上电…

套料排版代码python_雕刻机排版下料套料软件,可生成G代码格式和DXF图形、木工下料...

橱柜门自动排版软件现已升级为2017版本,新增排版完成后版面显示详细订单尺寸,省去人为测量麻烦,废料可以入后期的排版当中继续自动排版,板材优化率比2014更加优化,搜索精度更高,避免频繁换刀操作,单头雕刻机代码可以拆开导出NC代码,大大降低出错的频率,软件新增上百套…

centos 8 的图形操作界面在哪_文泰刻绘2020下载-文泰刻绘2020官方版下载[图形化编程平台]...

文泰刻绘2020官方版是一款高效实用的电脑刻绘软件。文泰刻绘2020最新版采用最新V10版专用刻绘程序,可以直接刻绘输出,支持USB刻字机,软件支持最新win10操作系统。文泰刻绘2020官方版还提供编辑、排版、图像处理、彩色处理、表格排版、刻绘输出…

vue设置右边距_数控CNC雕刻机使用系列之二: 维宏软件的参数设置

雕刻机控制软件的启动和设置 1、 NCStudio 雕刻机控制 软件 的启动 NCStudio 控制软件和运动控制卡的安装完成后,会在桌面上和开始->程序菜单中都有启动 NCStudio 软件的快捷方式。此时通过鼠标双击相应的快捷方式即可启动 NCStudio软件。 启动后画面如下: 1、 NCStudi…

国内外著名CAD、CAM雕刻软件介绍

目前国内常用的CNC雕刻软件平面雕刻(阴雕、阳雕)的话基本就用文泰和Type3,3D雕刻的话基本用北京精雕和ArtCAM(2018年7月7日AutoDesk公司宣布停止此产品的更新)。下面就个人意见分分享下个人使用感受!这里值…

文泰 单笔划 字 教程

文泰 单线字教程 启动文泰,一般默认A4,创建文件。 选择字体,高度和宽度。这些后期也可以修改。字体大小 6 到10 比较合适。根据自己的排版需要后期也可以更改大 小。 录入文字 写完后点击 确认 装在电脑系统里的TTF 手写字体都可以使用 根据需要更改字体…