Spring的Bean的生命周期

news2024/11/25 7:12:57

Spring的Bean的生命周期

  • Spring的Bean的生命周期




Spring的Bean的生命周期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXXjxFwg-1685074401885)(img_9.png)]

Spring的Bean的生命周期包括以下阶段:

  • (1)实例化Instantiation
  • (2)填充属性Populate properties
  • (3)处理Aware接口的回调处理
  • (4)BeanPostProcessor的前置处理
  • (5)InitializingBean的afterPropertiesSet()方法
  • (6)init-method属性指定的初始化方法
  • (7)BeanPostProcessor的后置处理
  • (8)DisposableBean的destroy()方法
  • (9)destroy-method属性指定的初始化方法

bean四个阶段: 实例化、属性填充、初始化、销毁

  1. 实例化Bean:

对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。

对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。

  1. 设置对象属性(依赖注入):

实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成属性设置与依赖注入。

  1. 处理Aware接口:

Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的一些资源:

①如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,传入Bean的名字;
②如果这个Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
②如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。
③如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;

  1. BeanPostProcessor前置处理:
    如果想对Bean进行一些自定义的前置处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(
    Object obj, String s)方法。

  2. InitializingBean的afterPropertiesSet()方法:
    如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。

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

  4. BeanPostProcessor后置处理:
    如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)
    方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;

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

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

  2. destroy-method属性指定的初始化方法:
    最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。






我的Github地址,欢迎大家加入我的开源项目,或者(在我的主页联系我)加入你们的开源项目,点点Github-Stars。

\开源项目名称依赖类型版本号描述
1spring-boot-starter-triepom1.0.0-SNAPSHOT特定需求下查询速度远超开源检索工具,innodb下B+树或者ES中倒排索引无法与之比拟.
2spring-boot-starter-triejar1.0.0-M1提供了基于SpringCloud的服务节点,可以通过Nacos注册中心进行服务发现,实现了树的动态扩容与缩容,以及服务的动态上下线。
3Data-Providerpom1.0.0-SNAPSHOT提供了多种数据源的查询,以及数据的类型同步,作为一个Jar可以依赖在其他服务上动态的提供数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/571364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【查找充电设备组合】【2023Q1 100分】

一、题目描述 某个充电站,可提供n个充电设备,每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和,均构成功率集合P的1个元素。功率集合P的最优元素,表示最接近充电站最大输出功率p_max的元素。 二、输入描述 输…

( 链表) 203. 移除链表元素 ——【Leetcode每日一题】

❓203. 移除链表元素 难度:简单 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1…

探秘 | 如何分辨内网和外网?

目录 💡 什么是外网IP、内网IP? 💡 对于自有路由器上网的用户,可以这样理解外网IP、内网IP 💡 几个大家经常会问的问题 什么是外网IP、内网IP?很多用户都有一个疑惑,如果不使用路由器拨号上网…

一则历史:为什么网络路径前加一个盘符还能正常工作

有一个比较知名的奇异特性:文件系统在解析 UNC(Universal Naming Convention) 路径时,会故意忽略掉最前面添加的盘符字母。 举个例子,假设服务器上有一个共享文件夹,其路径为:\\server\share\directory,如果…

【网络】HTTP

在上面的文章中,我们学习了网络的基础,和网络中一个伟大的标准 OSI 7层模型。通过上篇文章,我们可以知道网络模型最上层为应用层,那么这篇文章就让我们来一起看一下,我们开发过程中绕不开的一个非常著名的应用层协议&a…

FANUC机器人CC-Link总线通信相关配置的具体方法和步骤详解

FANUC机器人CC-Link总线通信相关配置的具体方法和步骤详解 1. 基本说明 2. 采用CC-Link通信的前提条件 机器人需要安装软件:CC-link Interface(Slave) A05B-*-J786 机器人需要安装硬件通信板卡:CC-Link Remote Device Station PCB A05B- * -J110 通信板卡的安装步骤:

第八章 模块

内容框架 8.1 模块介绍 引入模块 import 模块名 通过一句话,计算机就在指定的位置找到了模块文件,并准备好该文件拥有之后会用到的函数和属性。 引入模块本质上就是在一个python文件中引入另一个python文件 引入模块在文档中还可以设置别名:…

没有权限merge到源git仓库?一招教你如何解决。

在git上贡献项目的时候,一般步骤是,clone源项目到本地,切出一个新的分支,然后在新分支上开发,最后push到远程,然后提出mr。但是对于一些非开源的项目,可能会出现: 这就是说明没有权…

mp4是什么格式?如何录制mp4格式的视频?

案例:怎样录制mp4格式的视频? 【我发现网上大部分视频都是mp4格式,我也想在电脑上录制mp4格式的视频。有没有小伙伴知道录制的方法?】 日常生活中,mp4格式已经成为了我们最常用的视频格式之一。它具有高质量、高压缩…

chatgpt赋能python:Python主进程:一步步了解Python中最重要的进程

Python主进程: 一步步了解Python中最重要的进程 在Python编程中,进程是非常重要的一个概念。Python主进程是Python程序在启动的时候默认创建的一个进程,它是整个程序的核心。在使用Python进行开发的时候,了解Python主进程的概念和功能是非常…

gitlab搭建与认证登录

gitlab搭建与认证登录 gitlab的安装配置gitlab中Ldap认证配置 gitlab的安装配置 参考链接: Gitlab 仓库搭建(详细版) 以下4项注意点: gitlab安装包,直接访问在浏览器上下载速度很慢,可复制链接到迅雷中进…

淘宝店铺所有商品数据接口

淘宝店铺所有商品数据接口是淘宝提供的一种可以获取某个淘宝店铺所有商品信息的接口。通过该接口,可以获取到该店铺的所有商品信息,包括商品的标题、价格、销量、评分等。接口返回的数据格式为JSON格式,可以方便地处理数据。 我们可以通过调…

[论文评析]C-Mixup: Improving Generalization in Regression, NeurIPS,2022

C-Mixup: Improving Generalization in Regression 前言C-MixupReferences 前言 Mixup方法是针对分类任务的, 这篇方法相当于时提出了regression版本的Mixup, 实验证实能够大幅提升在regression task上的泛化能力. C-Mixup 是否可以把Mixup直接用于Regression task呢? 在原…

仓储服务-采购业务

1.合并采购需求 请求参数 {purchaseId: 1, //整单iditems:[1,2,3,4] //合并项集合 }(1) 合并时如果未选择合并的采购单,则先新建采购单然后合并到新建的采购单 新建的采购单,可以手动给采购单分配人员 (2)合并时选中了采购单…

linuxOPS基础_运维概述,及其泛概念

运维岗位定义 什么是运维? ​ 在技术人员(写代码的)之间,一致对运维有一个开玩笑的认知:运维就是修电脑的、装网线的、背锅的岗位。 ​ IT运维管理是指为了保障企业IT系统及网络的可用性、安全性、稳定性&#xff0…

学习go的操作(本人已有c的基础,请思考后再看)

建立一个文件(我的第一个文件是hellow.go),后在终端执行一下几步:我用的是go build先编译成了可执行文件(.exe)【1.go build hellow.go 2.hellow.exe】。当然,你也可以用go run直接运行【…

【c语言习题】函数递归调用实现汉诺塔

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

stable-diffusion安装controlnet插件

1、通过url安装controlnet插件 1&#xff09;extensions → install from URL → install 然后填入&#xff1a;https://github.com/Mikubill/sd-webui-controlnet 2&#xff09;installed → apply and restart UI 2、下载模型 下载controlnet模型&#xff08;50G左右&#…

chatgpt赋能python:Python交互:让你的编程更高效

Python 交互&#xff1a;让你的编程更高效 Python 是一门功能强大的编程语言&#xff0c;拥有大量的第三方库、工具和框架&#xff0c;能够帮助开发者实现各种各样的功能和应用。在 Python 编程中&#xff0c;交互&#xff08;Interactive&#xff09;模式是一种非常重要的工具…

探索基于人工智能的手机在网时长风险评估

引言 在当今竞争激烈的商业环境中&#xff0c;企业面临着不断增长的风险和挑战。为了保持竞争优势和提供优质的用户体验&#xff0c;企业需要能够准确评估用户的风险&#xff0c;并提供个性化的服务来满足不同用户的需求。 本文将介绍如何结合手机在网时长、手机在网状态和手…