Spring容器中beanName为何有三处存储?

在Spring容器中,DefaultListableBeanFactory类维护了三个变量来存储bean名称:beanDefinitionMap、beanDefinitionNames和frozenBeanDefinitionNames。那么,为何不能直接使用beanDefinitionMap.keys()替代后两个变量呢?

原因如下:

1. beanDefinitionMap的特性

beanDefinitionMap是一个ConcurrentHashMap,它无法保证迭代顺序。如果直接使用它的keys,在注入bean时无法保证名称顺序与注册顺序一致。

2. beanDefinitionNames的用途

beanDefinitionNames是一个有序列表,专门记录bean的注册顺序。注入时,Spring可以按照此顺序逐个实例化和注入bean。

3. frozenBeanDefinitionNames的用途

frozenBeanDefinitionNames是一个字符串数组,记录已冻结的bean名称。当DefaultListableBeanFactory处于冻结阶段时,不允许修改或添加新bean定义。

此时,frozenBeanDefinitionNames设置为null,以便在下一次访问时重新计算和更新冻结的bean名称。此过程在调用getMergedBeanDefinition方法时进行。

以上就是Spring容器中Bean名称的三处存储:为何不只用beanDefinitionMap?的详细内容,更多请关注慧达安全导航其它相关文章!

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部