2月21日

news2024/10/5 14:36:16

Bean生命周期

过程概述

创建对象

        实例化(构造方法)

        依赖注入

初始化

        执行Aware接口回调

        执行BeanPostProcessor.psotProcessBeforeInitialization

        执行InitializingBean回调(先执行@PostConstruct)

        执行BeanPsotProcessor.postProcessAfterInitialization

使用对象

销毁对象

        执行DisposableBean回调(先执行@PreDestory)

源码解析

创建对象

        实例化(构造方法)

        依赖注入

初始化

        执行Aware接口回调

        执行BeanPostProcessor.psotProcessBeforeInitialization

        执行InitializingBean回调(先执行@PostConstruct)

        执行BeanPsotProcessor.postProcessAfterInitialization

使用对象

销毁对象

        执行DisposableBean回调(先执行@PreDestory)

答案提取

总:Bean的生命周期总的来说有四个阶段,分别由创建对象、初始化对象、使用对象和销毁对象,而且这些工作大部分是交给Bean工厂的doCreateBean方法完成的

分: 首先,在创建对象阶段,先调用构造方法实例化对象,对象有了后回填充该对象的内容,其实就是处理依赖注入

其次,对象创建完毕后,需要做一些初始化的操作,涉及到如下几点:

        1.执行Aware感知接口的回调方法

        2.执行Bean后置处理器的postProcessBeforeInitialization方法

        3.执行InitializingBean接口的回调,在这一步如果Bean中有标注了@PostConstruct注解的方法,会先执行它

        4.执行Bean后置处理器的postProcessAfterInitialization

在这些操作都执行完了以后,Bean的初始化也就算完成了

接下来,在试用阶段就是程序员从容器中获取Bean使用

最后,在容器销毁之前,会先销毁对象,此时会执行DisposableBean接口的回调,这一步如果Bean中标注了@PreDestory接口的函数,会先执行它

总:简单总结,Bean的生命周期共包含四个阶段,其中初始化对象和销毁对象是可以有程序员自身的扩展发挥的空间

Bean循环依赖

循环依赖是指依赖闭环的问题

 

SPring默认是不允许循环依赖的存在的

可以通过配置文件让Spring解决循环依赖问题

 

过程概述

源码解析

答案获取 

总:Bean的循环依赖是指A依赖B,B又依赖A这样的依赖闭环问题,在Spring中,通过三个对象缓存区来解决循环依赖问题,这三个缓存区被定义到了DefaultSingletonBeanRegistry中,分别是singletonObjects用来存储创建完毕的Bean、earlySingletonObjects用来存储未完成依赖注入的Bean,还有SingletonFactories用来存储创建Bean的ObjectFactory。假如说现在A依赖B,B依赖A,整个Bean的创建过程就下面这样的:

分:首先,调用A的构造方法实例化A,当前的A还有没处理依赖注入,此事暂且将它称为半成品,这个半成品A会封装到一个ObjectFactory中,存储到SpringFactories缓存区里

        接下来会处理A的依赖注入,由于此时B实例还不存在,所以会先实例化一个B,当然,这个B的实例也会被封装到ObjectFactory中,存储到springFactories缓存区中

        紧接着要处理的就是B的依赖注入,此时会先从SpringFactories中找到A对应的ObjectFactory,调用它的getObject方法得到刚刚的半成品实例化A(如果休要代理对象,则会自动创建代理对象,将来得到的就是代理对象,这里引申出第三层存在的意义,为了处理动态代理问题,如果不考虑动态代理问题,仅用前两层就可以解决循环依赖问题),把得到的半成品A注入给B,并同时会把半成品A存入到earlySingletonObjects中,将来如果还有其他类的循环依赖了A,就可以直接从earlySingletonObjects中找到它,那么此时springFactories中创建的存储A的ObjectFactory也就可以删除了

        至此,B中的依赖注入处理完毕,B也就创建完毕了,B对象就会被存入到singletonObjects中去,同时,springFactories中创建的存储有B对象的ObjectFactory也就被删除了

        B创建完毕后就要继续处理A的依赖注入了,将完成品B注入给A以后,A也就创建完毕了,就可以把A对象有人存入到singletonObjects中,并且删除掉earlySingletonObjects中存储的半成品A

        至此,A,B都实例化完成,完成品都呗存入到singletonObjects中,将来通过容器获取对象,都是从singletonObjects中获取

总:总结起来是一句话,借助于DefaultSingletonBeanRegistry的三个缓冲区来解决循环依赖问题

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

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

相关文章

Javaweb之SpringBootWeb案例之切入点表达式的详细解析

3.3 切入点表达式 从AOP的入门程序到现在,我们一直都在使用切入点表达式来描述切入点。下面我们就来详细的介绍一下切入点表达式的具体写法。 切入点表达式: 描述切入点方法的一种表达式 作用:主要用来决定项目中的哪些方法需要加入通知 …

ffmpeg TS复用代码详解——mpegtsenc.c

一、mpegtsenc.c 整体架构 二、主要函数 mpegts_write_pes(AVFormatContext *s, AVStream *st, const uint8_t *payload, int payload_size, int64_t pts, int64_t dts)这个函数就是TS打包的主函数了,这个函数主要功能就是把一帧数据拆分成188字节的TS包&#xff0…

自助点餐系统微信小程序,支持外卖、到店等

总体介绍 系统总共分为三个端:后端,后台管理系统、微信小程序。 基于当前流行技术组合的前后端分离商城系统: SpringBoot2MybatisPlusSpringSecurityjwtredisVue的前后端分离的商城系统, 包含分类、sku、积分、多门店等 预览图…

FariyGUI × Cocos Creator 入门

前言 程序员向的初探Cocos Creator结和FairyGUI的使用,会比较偏向FairyGUI一点,默认各位读者都熟练掌握Cocos Creator以及js/ts脚本编写。 初探门径,欢迎大佬指教,欢迎在评论区或私信与本人交流,谢谢! 下…

DBSCAN密度聚类介绍 样本点 样本集合 半径 邻域 核心对象 边界点 密度直达 密度可达 密度相连

DBSCAN密度聚类介绍 样本点 样本集合 半径 邻域 核心对象 边界点 密度直达 密度可达 密度相连 简介概念定义原理DBSCAN的优点DBSCAN的缺点小尝试制作不易,感谢三连,谢谢啦 简介 DBSCAN(Density-Based Spatial Clustering of Applications wi…

Codeforces Round 927 (Div. 3)(A,B,C,D,E,F,G)

这场简单些,E题是个推结论的数学题,沾点高精的思想。F是个需要些预处理的DP,G题是用exgcd算边权的堆优化dijkstra。C题有点骗,硬啃很难做。 A Thorns and Coins 题意: 在你的电脑宇宙之旅中,你偶然发现了…

LeetCode 0105.从前序与中序遍历序列构造二叉树:分治(递归)——五彩斑斓的题解(若不是彩色的可以点击原文链接查看)

【LetMeFly】105.从前序与中序遍历序列构造二叉树:分治(递归)——五彩斑斓的题解(若不是彩色的可以点击原文链接查看) 力扣题目链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-a…

java数据类型、运算符

一、数据的表示详解 1.1 整数在计算机中的存储原理 任何数据在计算机中都是以二进制表示的。那这里肯定有人问,什么是二进制啊?所谓二进制其实就是一种数据的表示形式,它的特点是逢2进1。 数据的表示形式除了二进制(逢2进1&…

Https证书续签-acme.sh-腾讯云之DnsPod

ename 域名切换到 DnsPod 上面解析 可以先看下之前的 acme.sh 介绍文章然后再来次补充更多。 之前说过了 acme.sh 在阿里云下的使用。 这里做个后续补充 之前的域名是在 ename 上的 ,为了自动续签切换到 DnsPod 上面解析 注意事项 可以把原来 ename 上的解析先导出…

Android全新UI框架之Jetpack Compose入门基础

Jetpack Compose是什么 如果有跨端开发经验的同学,理解和学习compose可能没有那么大的压力。简单地说,compose可以让Android的原生开发也可以使用类似rn的jsx的语法来开发UI界面。以往,我们开发Android原生页面的时候,通常是在xml…

【八股文面试】Java基础常见面试题总结(上)

Java基础常见面试题总结(上) Java有哪些特性 简单易学;面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关性);支持多线程( C 语言没有内置的多…

Springcloud:LiteFlow

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、LiteFlow简介 二、规则编排关键字及语法 1、THEN: 2、WHEN: 3、AND: 4、OR: 5、IF: 6、ELSE&…

手动代码实现神经网络

网络结构 第一层有13个神经元,第二层8个神经元,第三层是输出层;其中第一层的激活函数是relu,第二层是sigmoid 代码实现 # 导入库 import torch import torch.nn as nn from torch.nn import functional as F # 确定数据 torch…

使用IntelliJ IDEA查看接口的全部实现方法

在大型Java项目中,经常会使用接口和抽象类进行代码设计。为了更好地了解代码结构和功能,我们需要快速查看一个接口的所有实现类。IntelliJ IDEA提供了一些方便的方法来实现这一目标。 1. 点击查看接口的实现子类 在IDEA中,你可以轻松地查看…

swagger 内容信息与代码不一致,已解决

ApiModel是Swagger中的常用到的注解,检查下信息错误的实体类的ApiModel的value值是否一致,应该是写错了,是不是张冠李戴了

STM32 TIM2重映射

STM32定时器 文章目录 STM32定时器[TOC](文章目录) 前言一、问题分析二、代码 前言 最近想弄一个多路输出PWM,但是发现TIM2不能用,根据手册也对它进行重映射了,但是还是不能用,用示波器发现驱动能力比较弱,然后禁用jt…

博途PLC PID仿真(单容水箱液位高度控制)

单容水箱和双荣水箱的微分方程和数值求解,可以参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/131139432https://rxxw-control.blog.csdn.net/article/details/131139432这篇博客我们利用欧拉求解器在PLC里完成单容水箱的数学建模。PLC也可以和MATL…

【笔记】【算法设计与分析 - 北航童咏昕教授】绪论

算法设计与分析 - 北航童咏昕教授 文章目录 算法的定义定义性质 算法的表示自然语言编程语言伪代码 算法的分析算法分析的原则渐近分析 算法的定义 定义 给定计算问题,算法是一系列良定义的计算步骤,逐一执行计算步骤即可得预期的输出。 性质 有穷性确…

运维07:堡垒机

什么是跳板机 跳板机就是一台服务器而已,运维人员在使用管理服务器的时候,必须先连接上跳板机,然后才能去操控内网中的服务器,才能登录到目标设备上进行维护和操作 开发小张 ---> 登录跳板机 ---> 再登录开发服务器 测试…