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