Spring bean的生命周期

2023-11-07

对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制。

bean的声明
在这里插入图片描述
bean的声明有好几种,如上图。
上图声明的一些bean信息可以通过ClassPathXmlApplicationContext(bean.xml)进行加载解析配置信息

源码:

// Tell the subclass to refresh the internal bean factory.
//告诉子类刷新内部bean工厂,加载配置文件
//最重要的是创建BeanDefinition对象
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

加载解析配置信息后会封装成一个BeanDefinition对象(bean的定义信息),然后会根据bean的信息进行初始化,然后实例化,然后被使用,最后被销毁。

但是,Spring作为一个开源可扩展的基础框架,所以,在从配置信息解析出的bean的定义信息到实例化中间添加一些其他的可扩展操作。

在这里插入图片描述
此时会调用执行BeanFactoryPostProcessor做一些准备工作:

  • 准备beanPostProcessor
  • 准备监听器、事件、广播器

源码如下:

// Allows post-processing of the bean factory in context subclasses.
//允许在上下文子类中对bean工厂进行后处理。
//子类覆盖方法做额外的处理
//此处我们自己一般不做任何扩展工作,但是web中有具体是实现。
postProcessBeanFactory(beanFactory);

然后通过反射进行实例化,实例化时,所有的属性都是默认值,还未填充属性;会在初始化时进行属性的填充。而bean的实例化和初始化的整个过程就是bean的生命周期。

Spring中每个Bean的生命周期如下:
在这里插入图片描述
简述:getBean->实例化->填充属性->初始化
1、实例化bean

一、对于BeanFactory容器:当请求未初始化bean时,BeanFactory调用createBean()进行实例化。

二、对于ApplicationContext容器:当容器启动后,获取对象BeanDefinition信息,实例化所有Bean

2、设置对象属性(依赖注入)

实例化后的对象封装在BeanWrapper中,容器根据BeanDefinition中的信息和BeanWrapper对象提供的设置属性的接口完成依赖。

BeanDefinition实际上包括一些Bean的信息,比如BeanName, Scope, 是否被**@Primary注解修饰,是否是@Lazy**,以及**@Description**等注解

3、处理Aware接口
用户可以实现各种Aware接口进行自定义功能;在进行到此处,容器会调用Aware接口进行实现(比如BeanFactoryAware)

1、如果实现了BeanNameAware接口,会调用实现setBeanName(String beanId)方法,参数为spring中bean的id值

2、如果实现了BeanFactoryAware接口,会调用实现setBeanFactory()方法,传递spring工厂本身。

3、如果实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文。

4、BeanPostProcessor
BeanPostProcessor可以根据次接口进行扩展功能,比如AOP

如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;

5、InitializingBean和init-method

如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。

6、如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;

以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。

7、DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

8、destroy-method:最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

我自己画了个图:
在这里插入图片描述
号外!号外!

最近面试BAT,整理一份面试资料,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。偶尔还有不定期的资料分享和红包发放!如果你想提升自己,并且想和优秀的人一起进步,感兴趣的朋友,可以在扫码关注下方公众号​。

喜欢就分享
认同就点赞
支持就在看

一键四连,你的offer也四连图片

本文作者:Java技术债务
原文链接:https://www.cuizb.top/myblog/article/1643817193
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring bean的生命周期 的相关文章

  • 匿名内部类显示不正确的修饰符

    据我了解 以下代码应该打印true作为输出 但是 当我运行这段代码时 它正在打印false 来自 Java 文档15 9 5 匿名类 https docs oracle com javase specs jls se8 html jls 1
  • 使用 Gson 序列化时如何公开类名

    我的场景非常复杂 但总结如下 我试图了解编译器的源代码 并了解每个 AST 节点代表什么 我正在生成不同程序的 AST 的 JSON 序列化 然后检查可视化的 JSON 输出 它工作得很好 除了一个问题是在 Gson 中生成的 JSON 数
  • 按对象值分组,统计后按最大对象属性设置组键

    我设法使用 Java 8 Streams API 编写了一个解决方案 该解决方案首先按对象 Route 的值对列表进行分组 然后计算每组中的对象数量 它返回一个映射 Route gt Long 这是代码 Map
  • GSON:自定义对象反序列化

    好吧 我编辑了这个问题 因为它不够清楚 Edit 2 更新了 JSON 文件 我在 Android 应用程序中使用 GSON 我需要解析来自服务器的 JSON 文件 而且有点太复杂了 我不想让我的对象结构太重 所以我想简化内容 所以我的对象
  • 如何在 Java 中安装附加包?

    我对 Java 很陌生 我想使用名为的包中的一些功能daj 教程代码有以下几行 import daj import java util import java lang Math import Msg 但第一行和第四行会产生红色下划线 导致
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • 将二进制数据的 byte[] 转换为 String

    我有二进制格式的数据 hex 80 3b c8 87 0a 89 我需要将其转换为字符串 以便通过 Jackcess 将二进制数据保存在 MS Access 数据库中 我知道 我不打算在 Java 中使用 String 来存储二进制数据 但
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • Java - 同步方法导致程序大幅减慢

    我正在尝试了解线程和同步 我做了这个测试程序 public class Test static List
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 在 javafx 中注册鼠标处理程序,但处理程序不是内联的

    我有一个 JavaFX 应用程序变得有点大 我想保持代码的可读性 我有一个折线图 我希望内置缩放功能 该功能在单击鼠标时发生 我知道我需要向图表注册鼠标侦听器 我无法从 Oracle 示例中弄清楚什么 即如下所示 http docs ora
  • 为什么 Java 中的 hashCode() 可以对不同对象返回相同的值?

    引用我正在读的书中的一段话首先Java http www amazon co uk Head First Java Kathy Sierra dp 0596009208 关键是 哈希码可以相同 但不一定保证对象相等 因为使用的 哈希算法 h
  • 在 Spring Security SAML 身份验证请求中配置 POST ProtocolBinding

    Spring Security SAML 坚持在 SAML 身份验证请求中请求 Artifact 绑定 ProtocolBinding 属性
  • Java 中意外的负数

    import java util public class Prac9FibonacciNumbers public static void main String args int x new int 100 x 0 1 x 1 1 fo
  • kafka Avro 多个主题的消息反序列化器

    我正在尝试以 avro 格式反序列化 kafka 消息 我使用以下代码 https github com ivangfr springboot kafka debezium ksql blob master kafka research c
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • Spring Boot:在映射级别指定端口

    Spring Boot 我希望实现以下目标 一些 URL 路径映射到一个端口 一些映射到另一个端口 换句话说 我想要这样的东西 public class Controller1 RequestMapping value path1 port
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 如果所有类不在同一个包中,Spring @autowired 不起作用

    我有四个包裹 com spring org Files HomeController java com spring org dao Files SubscriberDao java SubscriberDaoImpl java com s
  • RecyclerView 适配器的 Kotlin 泛型

    我正在尝试编写一个通用的 recyclerview 适配器 我找到了几个例子 然而 仍然无法弄清楚如何实现通用适配器 我写的代码是 open abstract class BaseAdapter

随机推荐

  • 计算机中模板与母版的区别,ppt中母版模板主题版式之间的区别和联系?

    ppt中母版模板主题版式之间的区别和联系 由会员分享 可在线阅读 更多相关 ppt中母版模板主题版式之间的区别和联系 1页珍藏版 请在人人文库网上搜索 1 模板是现成的样式 包括图片动画等 直接输入内容就可以使用了 母版是自己设计模板的菜单
  • STM32单片机Flash模拟EEPROM

    摘要 STM32单片机都带有ROM和RAM 其中STM32根据自身的ROM Flash 可以分为小容量产品 中容量产品 大容量产品 根据FLASH容量可以分为 小容量 0 32K 中容量 64 128K 大容量 256K以上 包含256K
  • 【Green公式】Hunter’s Apprentice(判断多边形为顺时针或逆时针)--鞋带公式

    题目描述 When you were five years old you watched in horror as a spiked devil murdered your parents You would have died too
  • C语言字节对齐

    文章来源于 点击打开链接 文章最后本人做了一幅图 一看就明白了 这个问题网上讲的不少 但是都没有把问题说透 一 概念 对齐跟数据在内存中的位置有关 如果一个变量的内存地址正好位于它长度的整数倍 他就被称做自然对齐 比如在32位cpu下 假设
  • ElasticSearch基础操作入门

    参考 4条消息 教你快速入门ElasticSearch 超详细简单 暗余的博客 CSDN博客 elasticsearch菜鸟教程 一个索引就是一个拥有几分相似特征的文档的集合 使用Chrome浏览器ElasticSearch Head 具体
  • 巨潮资讯网年报爬虫

    巨潮资讯网年报爬虫 代码直接复制即可使用 这是一个Post请求爬虫 与Get请求存在一点小区别 不过核心思想是一致的 Tips 需要在py文件夹目录下 新建一个 年报 名称的文件夹 存放下载的报表 同时在py文件夹目录下 需要一个stock
  • 游戏开发Unity杂项知识系列: CSharpCodeProvider could not be found in the namespace Micrrosoft.CSharp

    unity 进行build and run 时报错 The type name CSharpCodeProvider could not be found in the namespace Microsoft CSharp This typ
  • numpy学习笔记

    Numpy基础数据结构 NumPy数组是一个多维数组对象 称为ndarray 其由两部分组成 实际的数据 描述这些数据的元数据 import numpy as np import time ar np array 1 2 3 4 5 6 7
  • 什么是拷贝构造函数?拷贝构造函数何时被调用

    1 什么是拷贝构造函数 CA const CA C 就是我们自定义的拷贝构造函数 可见 拷贝构造函数是一种特殊的构造函数 函数的名称必须和类名称一致 它的唯一的一个参数是本类型的一个引用变量 该参数是const类型 不可变的 例如 类X的拷
  • python widget_python 图形界面

    Python自带的库是支持Tk的Tkinter 使用Tkinter 无需安装任何包 就可以直接使用 Tk是一个图形库 支持多个操作系统 导入Tkinter包的所有内容 from tkinter import 从Frame派生一个Applic
  • R与R Studio及R tools不冲突版本

    R与R Studio及R tools不冲突版本 R 3 6 3 R Studio 1 1 463 R tools 35 R 4 0 2 R Studio 1 3 1073 R tools 4 0 其他造成R Studio打开空白问题 1 路
  • Python+Requests+Unittest+Excel 接口自动化测试框架之Request模块01

    1 Requests模块 a Request模块是Python中可以实现模拟Http协议的模块 b 安装方式很多 可以用pip install requests 2 举例 import requests class Http Request
  • php://filter伪协议(总结)

    前言 这篇文章主要是关于php filter伪协议中的知识点总结 分析了常见的用法 文章目录 前言 php filter伪协议总结 php filter伪协议介绍 php filter伪协议使用方法 php filter过滤器分类 filt
  • CSDN-markdown编辑器

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • 大数据分析机器学习的数据清理和准备

    数据清理和准备是任何机器学习项目中至关重要的第一步 尽管我们经常认为数据科学家花费大量时间来修改算法和机器学习模型 但现实情况是大多数数据科学家花费大量时间来清理数据 在大数据分析机器学习的数据清理和准备中 我们将逐步介绍使用Python进
  • 管理神话之23:随便多少人你都能管

    原文作者 Johanna Rothman Cindy 我要给你的团队再加三个人 Patrick 公司的CTO 斜靠在门口 话音刚落 他转身就想离开 等等 这事我们要讨论一下 你不能这样扔下炸弹后就一走了之 你为什么要我再招更多的人 Cind
  • java并发篇面试

    文章目录 java并发篇 java如何开启线程 怎么保证线程安全 Volatile和Synchronized有什么区别 Volatile能不能保证线程安全 DCL Double check Lock 单例为什么要加Volatile JAVA
  • pycharm激活, pycharm远程调试

    pycharm professional 2017 2 3下载 百度盘公开地址 https pan baidu com s 1geDnVVX 1 pycharm激活 license server 1 激活窗口选择 Activate new
  • C++ Thread

    Thread 线程库 线程的创建 detach 句柄独立 线程资源转移 sleep for 全局函数线程化 joinable hardware concurrency 线程的互斥 原子操作定义 互斥锁 try lock recursive
  • Spring bean的生命周期

    对于普通的Java对象 当new的时候创建对象 当它没有任何引用的时候被垃圾回收机制回收 而由Spring IoC容器托管的对象 它们的生命周期完全由容器控制 bean的声明 bean的声明有好几种 如上图 上图声明的一些bean信息可以通