Spring容器beanName为啥要存三个地方 beanDefinitionMap、beanDefinitionNames、frozenBeanDefinitionNames?
不太理解为啥DefaultListableBeanFactory
这个类的三个变量 beanDefinitionMap、beanDefinitionNames、frozenBeanDefinitionNames
直接用 beanDefinitionMap.keys()
代替beanDefinitionNames
和frozenBeanDefinitionNames
不可以吗?
回答:
1、beanDefinitionMap是一个ConcurrentHashMap,不能保证迭代的顺序,如果直接使用它的keys也就是bean的名称,spring在注入bean的时候,没有办法保证返回的bean名称的顺序与注册的顺序一致,主要是用beanDefinitionMap来存储bean的配置信息,如类名、作用域、依赖关系
2、beanDefinitionNames是一个ArrayList,是一个有序列表,就是用来记录bean的注册顺序的,依赖注入时,可以按照beanDefinitionNames的顺序逐个实例化和注入bean
3、frozenBeanDefinitionNames是一个String数组,使用数组的原因是因为frozenBeanDefinitionNames在期望情况下不应该发生改变,名字里的frozen(冻结)是spring生命周期里的一个阶段,在该阶段之后,不允许再修改或注册新的 bean 定义,frozenBeanDefinitionNames就是用来记录已经被冻结的bean的名称,调用 registerBeanDefinition 方法注册新的 Bean 定义时,意味着可能会修改已有的 Bean 定义或者添加新的 Bean 定义,因此需要把frozenBeanDefinitionNames 设置为 null,以便在下一次访问时重新计算和更新冻结的 Bean 名称。
在 DefaultListableBeanFactory 中,frozenBeanDefinitionNames 的计算和更新是在 getMergedBeanDefinition 方法中进行的。每次调用 getMergedBeanDefinition 方法时,会检查 frozenBeanDefinitionNames 是否为 null,如果是,则重新计算和更新冻结的 Bean 名称。
以上是 Spring容器beanName为啥要存三个地方 beanDefinitionMap、beanDefinitionNames、frozenBeanDefinitionNames? 的全部内容, 来源链接: utcz.com/p/945262.html