Spring的Bean存储探讨

4 篇文章 0 订阅
订阅专栏

上文猜想Bean在Spring存储,这篇文章就带着之前的猜想,进入源码中一一验证。
上文猜想
源码编译

如何找到Spring存储的容器

不知道你是否使用过操作Spring容器的工具类,在一些非SpringBean的对象里面,要使用Bean对象时,就没办法使用@Resource或者@Authorware注解注入。这是就需要使用SpringUtils.getBean(Clazz.class)来获取Bean对象。比如:(可以随便找一个,可能看到的实现类不相同,但是继续往里面看一点是一样的(容器肯定是同一个)))

1、从日常使用找到入口

在这里插入图片描述

2、ConfigurationListableBeanFactory

既然我们这里使用到的是ConfigurationListableBeanFactory,那我们就从这个里面分析。
在这里插入图片描述
从beanFactory.getBean(name)进去之前,你会发现进入到了BeanFactory接口,作为Bean的工厂,那是不是Bean的创建、存储、使用都是由这个来控制呢?
那我们接着看BeanFactory的实现类(看这个的实现类你会发现非常多,如果是第一次接触Spring源码的建议先找些视频学习下)。根据我们的经验,我们可以进入到ConfigurationListableBeanFactory接口查看实现类,getBean方法的实现肯定在对应某个实现类里面。
在这里插入图片描述
这样我们就找到了DefaultListableBeanFactory。既然找到了入口,那么接下来就是进入源码中的(但是不要忘记我们的任务,当前只是为了找寻对应容器而已,不要陷入其他逻辑中,不然很容易晕车-从入门到放弃)。

3、DefaultListableBeanFactory

第一个,我们进入到了DefaultListableBeanFactory中,查看对应的getBean方法。
在这里插入图片描述

4、DefaultListableBeanFactory.resolveBean()

这个没啥特殊的,方法里面很简单,然后就来到了resolveBean方法:这个方法咋一眼看,一脸懵逼,其实你看它的return,在结合Spring只有一个容器,我们随便找一个应该都能找到容器。
在这里插入图片描述
我们就选第一个return方法进入查看:这里面就主要三段代码,三段代码都和candidateNames有关。

String[] candidateNames = getBeanNamesForType(requiredType);

看这段代码,意思也非常明确:根据类型获取Bean的名称。那么并没有获取到真正的Bean对象。继续想办法找。
在这里插入图片描述
从return找到关键信息,找到getBean方法才是获取一个实例对象,然后返回:
在这里插入图片描述

5、AbstractBeanFactory.getBean()

在这里插入图片描述
接着看doGetBean(我这里的代码收起来了,只展示了一些关键逻辑):重点在getSingleton:获取单例的Bean
在这里插入图片描述

6、DefaultSingletonBeanRegistry.getSingleton():

在这里插入图片描述
我们先不分析这段代码逻辑,可以看到最后的bean对象是从singletonObjects、earlySingletonObjects、singletonFactories这里面取出来的。说明最终的Bean是存储在这些里面。那么跟我们之前的猜想基本一致,以Map的形势存储在内存当中。那么到这里关于Bean存储的猜想和验证基本上就结束了。
在这里插入图片描述
这里其实就是常常说的Spring的三级缓存,以及如何解决循环依赖问题的主要逻辑。我们后续在详细分析。
在这里插入图片描述

Spring 单例 Bean 与多线程深度分析
AI天才研究院
07-20 9360
Springbean默认是单例的,在高并发下,如果在 Spring 的单例 bean 中设置成员变量,则会发生并发问题。最近在进行开发时,错误的在单例的bean中使用了成员变量,导致多个线程大并发访问时,出现赋值错误及日志打印混乱的问题。本文就对单例 bean 及多线程安全的问题做一次较为深入的探讨,也是对自我的一次反省,之后的开发中,杜绝此类问题,修正开发习惯。单例模式首先我们回顾一下单例...
SpringBean为什么默认为单例:深入解析
最新发布
xycxycooo的博客
08-12 383
单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。单例模式的核心思想是限制类的实例化,使其在任何情况下都只有一个实例存在。SpringBean默认为单例的设计决策,基于性能优化、资源共享和线程安全等多方面的考量。单例模式通过减少对象创建开销、提高内存利用率、共享配置信息和状态管理,显著提升了应用的性能和可维护性。同时,Spring容器通过适当的线程安全机制,确保单例Bean在多线程环境下的安全访问。
SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)
小吉妙妙屋
05-13 4119
在项目中,我们自定义一个类,如果我们想把这个类交给ioc容器管理,加上@Component衍生注解即可如果这个类不是我们自己自定义的,是我们引入第三方依赖中的,而且我们还想把这个类交给ioc容器管理,那么我们应该定义一个方法,在这个方法上加上@Bean在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!
Spring Bean的生命周期及三级缓存流程
weixin_63426509的博客
09-09 1294
Spring Bean 的生命周期说起来其实就三个大块:实例化Bean -> 设置属性(注入和装配) -> 初始化 -> 使用Bean -> 销毁Bean这个很好理解,但是内部是怎么样注入,初始化以及销毁?经历怎么样的过程呢?追随这些问题来参考这篇文章。我们先从 三级缓存 -> 实例化... 顺序逐步理解。
JavaEE】Spring存储和获取Bean(使用注解)
p_fly的博客
04-16 1639
上篇文章的存储Bean是在Spring的配置文件下通过bean标签来把Bean存储Spring容器中,其中需要设置标签属性id 和 name,还是比较麻烦的,接下来介绍一种更为简单也最为常用的方法来存储Bean。但是通过方法名获取通常是不使用的,我们可以在@Bean注解后重写命名,通过新名字来获取,同时。5. 该注解是把方法的返回值存入到Spring中,如果方法没有返回值,就不能使用该注解。这是JDK提供的注入Bean的注解,和@AutoWired有以下的区别。上述工作完成后就可以通过注解存储Bean。
spring-boot 查找bean流程
TheThirdMoon的博客
03-06 1053
第二个问题,通过在spring.factories文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration属性内容记录bean的路径,来告送spring-boot有哪些bean。AutoConfigurationImportSelector 是实现查找的关键类,负责遍历项目中的jar包,并读取spring.factories中的内容并缓存起来。项目中的bean:只要告送spring-boot从哪个包下开始查找就可以。
spring容器核心原理--bean的存储以及Bean的三级缓存
李利科
11-08 4226
一.bean的存储 通常我们说,spring容器帮我们管理bean,但是什么是bean? 举个简单的例子,如果我们自己提供一个X.class类,那此时的X.class我们称之为class对象,在经过spring的一系列生命周期的处理之后,就会变成可以放到spring容器中的bean对象,我们称此时的对象是bean对象,所以,总结来说,经过一系列生命周期方法处理之后的class对象,就是bean对象; 只有经过一系列后置处理器方法的处理,才是一个合格的bean对象。 bean对象最终存储spring容器中,
Spring Bean生命周期&BeanDefinitions1
08-03
本篇文章将深入探讨Spring Bean的生命周期及其BeanDefinitions。 首先,Spring Bean的生命周期分为几个关键步骤: 1. **实例化**:这是生命周期的第一步,Spring通过反射或者工厂方法来创建Bean的实例。根据`<bean...
Spring自动扫描无法扫描jar包中bean的解决方法
08-30
不勾选"Add directory entries"时,jar包内部的类文件会按照扁平化的结构存储,这样Spring在扫描时无法定位到类的正确位置,因此无法加载Bean。而勾选这个选项后,jar包内的类文件会被组织成具有完整目录结构的形式...
详解SpringBean的加载的方法
08-30
本文将深入探讨SpringBean的加载过程,包括不同方式的加载、加载流程以及涉及到的关键类和方法。 首先,我们从最常见的Bean加载方式开始:通过`ApplicationContext`或者`BeanFactory`调用`getBean`方法。例如,`...
Spring】关于Spring的创建和使用以及bean的存储与获取
Superkom666的博客
05-10 330
spring是一个IoC容器,我们创建spring容器只需要在idea中创建一个maven项目,然后再pom.xml中添加相应的依赖,一个spring容器就创建好了在pom.xml中添加这段依赖就可以完成对spring的创建了。
Spring创建、Bean对象的存储和读取
冯同学的博客
11-26 1263
Spring创建、Bean对象的存储和读取
Spring】-SpringBean对象的存取
m0_63979882的博客
08-11 1362
spring存储Bean对象的三大方式:XML方式(Bean标签);五大类注解;方法注解。从spring中取对象的两种方式:基本方法、注解方法(属性注入、set注入、构造方法注入)。
spring 源码笔记 spring启动过程(概括篇)
TBryant的博客
12-24 395
何为spring容器 理论级别解释:由多个spring组件组成的应用程序叫spring容器。 代码级别解释:所有实现ApplicationContext接口的类都是spring容器。 如何得到一个普通对象 简单描述:.java —> class —> object 详细描述:创建.java文件 —> 编译得到.class文件 —> JVM加载到方法区得到class对象 —&...
spring容器中存储bean相关问题
小小少年的博客
04-25 596
通常我们说,spring容器帮我们管理bean,但是什么是bean?
bean的生命周期
yzq102873的博客
08-09 232
bean的生命周期
Spring 相关IOC 两个Map
Frame_X的博客
09-01 1872
SPRING 架构分析 spring官网:spring.io/projects spring是一个资源整合框架 ,通过spring可以将很多资源整合在一起,例如:连接池、MyBatid等。 对外提供相关服务,比如:秒杀、支付等; spirng中的IOC负责实现生命周期的管理和对象依赖关系的管理; spring框架架构: 1.下图为容器初始化步骤图: 个人分析为:一个被@Component组...
9 Spring创建的对象默认存在map中
no996yes885的博客
04-15 163
Spring把创建好的java对象放在map中。因此,使用bean.xml中标签里的id要唯一,因为它相当于map中的key!
SpringBean对象的存储和获取
mzpqq的博客
07-12 1586
想要将对象存储Spring 中,有两种注解类型可以实现: 1.类注解:@Controller【控制器】、@Service【服务】、@Repository【仓库】、@Component【组件】、@Configuration【配置】。 2.方法注解:@Bean。 接下来我们分别来看。 使用之前读取对象的方式来读取上面的 UserController 对象: 运行结果: 注意事项1:即使在spring配置文件中配置了bean的扫描路径,但是5大类注解是不能省略的。 注意事项2:即使加了5大类注解,但类没有放在
spring核心(装配Bean)
我是谁,我在哪,我在干嘛
05-31 1037
声明bean构造器注入和Setter方法注入装配bean控制bean的创建和销毁创建应用对象之间关联关系的传统方法(通过构造器或者查找)通常会导致结构复杂的代码,这些代码很难被复用也很难进行单元测试。如果情况不严重的话,这些对象所做的事情只是超出了它应该做的范围;而最坏的情况则是,这些对象彼此之间高度耦合,难以复用和测试。创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(...
写文章

热门文章

  • RabbitMQ Management指标说明 3670
  • Spring声明Bean的几种方式 278
  • Spring的Bean存储探讨 181
  • Srping之IoC猜想和疑问 147
  • Spring5.2.X源码编译 119

分类专栏

  • Spring源码 4篇
  • MQ 1篇
  • Java知识 1篇
  • 源码系列
  • 便捷工具
  • 解决方案

最新评论

  • Spring的Bean存储探讨

    韩楚风: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文

最新文章

  • Srping之IoC猜想和疑问
  • RabbitMQ Management指标说明
  • Spring声明Bean的几种方式
2023年5篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家便宜的生产玻璃钢雕塑厂家山东开业商场美陈供货商昆明玻璃钢雕塑生产临沂动物玻璃钢雕塑厂家五华区设计玻璃钢雕塑哪家好玄武十一商场美陈蚌埠创意玻璃钢雕塑重庆玻璃钢雕塑家厂家焦作人物玻璃钢雕塑玻璃钢商场美陈雕塑定做黄山商场户外美陈来宾玻璃钢泡沫雕塑实惠的玻璃钢动物雕塑河北周年庆典商场美陈价钱广东抽象玻璃钢雕塑定制玻璃钢雕塑钓鱼翁深圳佛像玻璃钢雕塑涟源户外玻璃钢雕塑卡通蟹老板玻璃钢雕塑厂家太原玻璃钢雕塑租赁标准玻璃钢的雕塑通州区商场美陈哪家好栖霞商场新春美陈玻璃钢雕塑制作教程视频台州大型玻璃钢雕塑批发成套玻璃钢花盆图片大全 室外辽宁商场创意商业美陈多少钱徐州玻璃钢雕塑供应商南宁玻璃钢雕塑小品个性玻璃钢蔬菜雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化