【spring】一文带你弄懂Spring Bean的生命周期(超详细,超级通俗易懂!!)

目录

首先让我们来回顾一下Spring中的Bean是什么

Bean的生命周期

然后让我们由浅及深的对Bean的创建过程进行了解

首先来看最核心的五步骤

然后让我们逐层递进,学习一下七步骤版本吧

现在我们就可以进一步了解十步骤的版本(完整的生命周期)


首先让我们来回顾一下Spring中的Bean是什么

        在Spring框架中,Bean是一个被Spring容器所管理的对象。Spring中的对象的创建、组装和管理是通过IOC思想和DI机制来完成的,而这些对象就被称为Bean。

        简单来说,Bean就是一个由Spring容器初始化、管理和维护的普通的Java对象。通过Spring容器,我们可以方便的创建和获取这些对象,并且可以配置它们的行为与属性。

在 Spring 中,我们可以配置 Bean 的定义和属性,以及它们之间的依赖关系。常见的配置方式包括 XML 配置文件、注解和 Java 配置类。

下面是一个使用 XML 配置 Bean 的示例:

<!-- Bean 的定义 -->
<bean id="userService" class="com.example.UserService">
    <!-- 设置属性 -->
    <property name="userDao" ref="userDao"/>
    <!-- 其他配置 -->
</bean>

<bean id="userDao" class="com.example.UserDao">
    <!-- 设置属性 -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 其他配置 -->
</bean>

        在上述示例中,UserServiceUserDao 都被定义为 Bean。userService 使用了 userDao 作为依赖,因此需要在配置中设置这个依赖关系。

        通过 Spring 容器的配置,Spring 会根据配置信息创建相应的 Bean,并将它们组装好。通过容器,我们可以获取到这些 Bean,并使用它们进行业务处理。

        除了 XML 配置外,Spring 还提供了注解和基于 Java 类的配置方式来定义 Bean。例如,使用注解时可以通过 @Component@Service@Repository 等注解将类声明为 Bean,而使用 Java 配置类时可以使用 @Bean 注解进行 Bean 的定义。

复习完Bean之后,就可以进一步探讨Bean是如何创建的,它的流程是怎样的。

Bean的生命周期

        首先可以来看一下整个Spring Bean完整的生命周期流程图,展示了从Spring 容器一开始的初始化Bean最终到销毁掉Bean的流程(大家可以简单看过一遍再详细看下面的讲解,在脑海里大概有一个概念,能够方便理解下面的讲述内容)

然后让我们由浅及深的对Bean的创建过程进行了解

首先来看最核心的五步骤

  1. 实例化——依赖注入之前已经创建的java对象,但是Spring Bean对外不可用(相当于一个空壳  )
  2. 依赖注入
  3. 初始化
  4. 使用Bean
  5. 销毁Bean

根据具体的代码例子,就能看出哪部分负责的什么规则了(非常容易理解)

 测试类

xml文件(配置了初始化方法——初始化步骤就自动调用执行了,销毁方法——销毁的时候就自动调用了)

 结果

然后让我们逐层递进,学习一下七步骤版本吧

多的两个步骤多在哪里?

  1. 初始化之前(BeanPostProcessor 的before方法)
  2. 初始化之后(BeanPostProcessor 的after方法——诸如AOP就是在这里面做的)

然后加入到五步骤版本的相应位置

1、实例化——依赖注入之前已经创建的java对象,但是Spring Bean对外不可用(相当于一个空壳  )

2、依赖注入

        3、初始化前——BeanPostProcessor before方法

4、初始化

         5、初始化前——BeanPostProcessor after方法

6、使用Bean

7、销毁Bean

然后这里自定义了一个MyProcessor,实现了BeanPostProcessor,来展示在声明周期中的作用

然后再在配置文件中进行配置,就可以启用啦

 结果展示

现在我们就可以进一步了解十步骤的版本(完整的生命周期)

绿色的为新增的具体步骤哦!

1、实例化——依赖注入之前已经创建的java对象,但是Spring Bean对外不可用(相当于一个空壳  )

2、依赖注入

                3、BeanNameAware BeanFactoryAware(类似的xxxaware方法)方法执行啦!(xxxAware可以让bean获取spring容器中的服务)

        4、初始化前——BeanPostProcessor before方法

                5、InitialingBean 接口的方法执行啦!

6、初始化

         7、初始化前——BeanPostProcessor after方法

8、使用Bean

        9、DisposableBean接口的方法执行啦!

10、销毁Bean

新实现了这三个接口

然后将三个接口的方法重写,就能在Bean生命流程中自动调用了 

 结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLMs之Code:Code Llama的简介、安装、使用方法之详细攻略

LLMs之Code&#xff1a;Code Llama的简介、安装、使用方法之详细攻略 导读&#xff1a;2023年08月25日(北京时间)&#xff0c;Meta发布了Code Llama&#xff0c;一个可以使用文本提示生成代码的大型语言模型(LLM)。Code Llama是最先进的公开可用的LLM代码任务&#xff0c;并有潜…

视频分割合并工具说明

使用说明书&#xff1a;视频分割合并工具 欢迎使用视频生成工具&#xff01;本工具旨在帮助您将视频文件按照指定的规则分割并合并&#xff0c;以生成您所需的视频。 本程序还自带提高分辨率1920:1080&#xff0c;以及增加10db声音的功能 软件下载地址 https://github.com/c…

C# 学习笔记--个人学习使用 <2>

C# 学习笔记 Chapter 2 比较硬的基础部分Section 1 委托Part 1 Action 与 func 委托的示例Part 2 自定义委托Part 3 委托的一般使用Part 4 委托的高级使用Part 5 适时地使用接口 Interface 取代一些对委托的使用 Section 2 事件Part 1 初步了解事件Part 2 事件的应用Part 3 事件…

一个简单的vim例子

一.欢迎来到我的酒馆 在本章节介绍vim工具。 目录 一.欢迎来到我的酒馆二.什么是vim 二.什么是vim 2.1什么是vim vim是一种Linux命令行类型 的文本编辑器。vim指的是"vi improved"&#xff0c;意思是vi工具的升级版。vim是基于vi实现的&#xff0c;它提供了…

【1654. 到家的最少跳跃次数】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位置&#xff08;即往右跳&#xff09;。它可以 …

C++中为什么有模板的函数不能和.h文件分离,即分别声明和定义

目录 1.查看问题 2.探索问题 3.解决问题 1.查看问题 1.先看下面三个文件 stack.h stack.cpp test.cpp 2.探索问题 有了解的小伙伴应该知道大概率是在预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接中编译环节出错了&#xff0c;它在其他文件中无法通过定义找到函…

MATLAB 2023安装方法之删除旧版本MATLAB,安装新版本MATLAB

说明&#xff1a;之前一直使用的是MATLAB R2020b&#xff0c;但最近复现Github上的程序时&#xff0c;运行不了&#xff0c;联系作者说他的程序只能在MATLAB 2021之后的版本运行&#xff0c;因此决定安装最新版本的MATLAB。 系统&#xff1a;Windows 11 需要卸载的旧MATLAB 版…

快手Java一面,全是基础

现在已经到了面试招聘比较火热的时候&#xff0c;准备面试的过程中&#xff0c;一定要多看面经&#xff0c;多自测&#xff01; 今天分享的是一位贵州大学的同学分享的快手一面面经。 快手一面主要会问一些基础问题&#xff0c;也就是比较简单且容易准备的常规八股&#xff0…

微信小程序云开发-云存储文件ID转http

一、前言 云开发的云储存文件默认是以cloudID的形式读取的&#xff0c;但是这种读取方式只能在微信小程序或内嵌H5中使用。 所以如果需要在其他地方使用&#xff0c;例如浏览器或网站等其他端读取文件的时候&#xff0c;需要转换成普通的http链接。 目前官方提供有转换的接口…

docker之Compose与DockerSwarm

目录 Compose 简介 概念 为什么需要&#xff1f; 配置字段 常用命令 安装 1.下载 2.授权 使用 1.创建文件 2.启动 docker Swarm 关键概念 调度策略 spread binpack random 特性 集群部署 1.准备 2.创建swarm并添加节点 在主服务器上创建swarm集群 节点…

8天长假快来了,Python分析【去哪儿旅游攻略】数据,制作可视化图表

目录 前言环境使用模块使用数据来源分析 代码实现导入模块请求数据解析保存 数据可视化导入模块、数据年份分布情况月份分布情况出行时间情况费用分布情况人员分布情况 前言 2023年的中秋节和国庆节即将来临&#xff0c;好消息是&#xff0c;它们将连休8天&#xff01;这个长假…

MongoDB入门

简介 MongoDB是一个开源、高性能、支持海量数据存储的文档型数据库 是NoSQL数据库产品中的一种&#xff0c;是最像关系型数据库&#xff08;MySQL&#xff09;的非关系型数据库 内部采用BSON(二进制JSON)格式来存储数据,并支持水平扩展。 MongoDB本身并不是完全免费的,它对于…

算法-图BFS/DFS-单词接龙

算法-图BFS/DFS-单词接龙 1 题目概述 1.1 题目出处 https://leetcode-cn.com/problems/number-of-islands 1.2 题目描述 给定两个单词&#xff08;beginWord 和 endWord&#xff09;和一个字典&#xff0c;找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如…

C++八股记录

C内存管理 C中&#xff0c;内存分成5个区。 栈&#xff1a;函数内局部变量&#xff1b;自动管理&#xff0c;效率高&#xff0c;但空间较小&#xff1b; 堆&#xff1a;new分配的内存块&#xff1b;手动管理&#xff0c;效率低&#xff0c;但空间大&#xff1b; 自由存储区&…

代码复现,我能行之DMP-MATLAB

代码复现&#xff0c;我能行——系列一 一、基础概念 Dynamic Movement Primitives &#xff08;DMP&#xff09;&#xff0c;中文为动态运动基元或动态运动原语&#xff0c;由美国University of Southern California的Stefan Schaal教授团队于2002年提出&#xff0c;是一种用…

2023年智慧政务一网通办云平台顶层设计与建设方案PPT

导读:原文《2023年智慧政务一网通办云平台顶层设计与建设方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 部分内容:

计算机竞赛 基于Django与深度学习的股票预测系统

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于Django与深度学习的股票预测系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff…

GIT 常用指令

基础指令 $ git init #初始化仓库&#xff0c;在该文件夹创建的为workspace$ git add . #已暂存 [.通配符&#xff0c;全部添加]$ git commit -m "log add file" #提交到仓库,并写了日志 ”log add file“$ git status #查看状态&#xff0c;可查看被修改的文件…

win11出现安全中心空白和IT管理员已限制对此应用的某些区域的访问

问题 windows安全中心服务被禁用 winr 输入services.msc 找到windows安全中心服务查看是否被禁用&#xff0c;改为启动&#xff0c;不可以改动看第三条 打开设置&#xff0c;找到应用—windows安全中心–终止–修复–重置 重启如果还是不行看第四条 家庭版系统需要打开gped…

新手指南:7个步骤制定成功的项目预算

每个项目都涉及成本。项目越大、越复杂&#xff0c;执行的时间和金钱成本就越高。企业不会拥有无限的资源&#xff0c;所以每个项目都需要项目预算。 但挑战在于&#xff1a;确定项目需要多少预算并不总是那么容易。低估需求&#xff0c;最终会导致人手短缺&#xff0c;无法按…