Spring容器中beanName为何要存储在三个不同的地方?

spring容器中beanname为何要存储在三个不同的地方?

Spring容器中beanName存放在三个地方的原因

Spring框架的DefaultListableBeanFactory类中,beanName存储在三个不同的变量:beanDefinitionMap、beanDefinitionNames和frozenBeanDefinitionNames。这三个变量各自承担着不同的职责,因此直接用beanDefinitionMap.keys()代替其他两个变量是不行的。

beanDefinitionMap

beanDefinitionMap是一个ConcurrentHashMap,用于存储bean的定义,包括其类名、作用域、依赖关系等。它是一个非有序的集合,无法保证bean名称的迭代顺序。

beanDefinitionNames

beanDefinitionNames是一个ArrayList,是一个有序的列表,用来记录bean的注册顺序。在依赖注入时,Spring可以按照beanDefinitionNames的顺序依次实例化和注入bean。

存了个图 存了个图

视频图片解析/字幕/剪辑,视频高清保存/图片源图提取

存了个图 17 查看详情 存了个图

frozenBeanDefinitionNames

frozenBeanDefinitionNames是一个String数组,在Spring生命周期的“冻结”阶段之后不允许再修改或注册新的bean定义。它用于记录已经“冻结”的bean的名称。

为何不能用beanDefinitionMap.keys()代替

顺序性:beanDefinitionNames记录了bean的注册顺序,而beanDefinitionMap.keys()无法保证此顺序。在依赖注入时,保持bean的注册顺序很重要。效率:frozenBeanDefinitionNames是一个String数组,它的计算和更新在“冻结”阶段完成。后续访问时,不再需要重新计算,提高了效率。冻结状态:frozenBeanDefinitionNames记录了“冻结”阶段之后不再允许修改的bean名称。而beanDefinitionMap.keys()包括所有bean的名称,不区分其状态。

总之,beanDefinitionMap、beanDefinitionNames和frozenBeanDefinitionNames三个变量分别用于存储bean的定义、注册顺序和“冻结”状态,它们共同确保了Spring容器中bean名称的正确存储和管理。

以上就是Spring容器中beanName为何要存储在三个不同的地方?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/381037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 11:19:42
下一篇 2025年11月6日 11:21:21

相关推荐

发表回复

登录后才能评论
关注微信