为什么 bean 定义存储在并发 hashmap 中?

Why bean definitions is stored in concurrent hashmap?

在classDefaultListableBeanFactory中有

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

bean 定义的存储位置。我是 Spring 的新手,我不明白为什么 IoC 容器需要 hashmap 的并发性。据我了解,我们只是从 XML 文件中读取 bean 定义并将它们存储在 hashmap 中。

我们为什么不使用常规 HashMap 来达到目的?

这是因为 bean 创建可以并行进行。因此,地图将成为关键数据。因此,如果对同一个密钥有任何更新,它是在串行模式下完成的,而不是并行的。

这就是使用 ConcurrentHashMap 的原因。现在另一个问题是谁将并行注册 bean。因此,它可以是 DefaultListableBeanFactory 的任何用户。所以为了使 beanDefinitionMap 上的所有操作都是线程安全的 ConcurrentHashMap 已被使用。

让我们通过例子来理解它:-

 private final DefaultListableBeanFactory factory = (DefaultListableBeanFactory) applicationContext
        .getAutowireCapableBeanFactory();

private void registerBean(String beanName, String scope) throws IOException {

    GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
    genericBeanDefinition.setBeanClassName("org.jibeframework.core.util.ViewComponentFactory");
    genericBeanDefinition.setScope(scope);
    genericBeanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_NO);
    genericBeanDefinition.setDependencyCheck(AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
    BeanDefinitionHolder holder = new BeanDefinitionHolder(genericBeanDefinition, beanName, new String[] {});
    BeanDefinitionReaderUtils.registerBeanDefinition(holder, factory);

}

现在 if this code is called inside a Thread 可能导致数据不一致、竞争条件等。这就是为什么 DefaultListableBeanFactory 中的所有方法在执行 [=18= 等操作时也会获取不同的锁 (together with using ConcurrentHashMap) ].

查看 DefaultListableBeanFactory#registerBeanDefinition 以获得更清晰的信息。参考 link here.