Hello! 欢迎来到小浪资源网!

Spring容器中Bean名称的三处存储:为何不只用beanDefinitionMap?


Spring容器中Bean名称的三处存储:为何不只用beanDefinitionMap?

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方法时进行。

相关阅读