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

Java 为什么bean定义存储在并发hashmap中?,java,spring,ioc-container,Java,Spring,Ioc Container,班上有 private final Map beanDefinitionMap=new ConcurrentHashMap(256); 存储bean定义的位置。我是Spring新手,我不明白为什么IoC容器需要hashmap的并发性。据我所知,我们只是从XML文件中读取bean定义并将它们存储在hashmap中 我们为什么不使用常规的HashMap呢?这是因为bean的创建可以并行进行。因此,地图将成为关键数据。因此,如果对同一个键有任何更新,它是在串行模式下完成的,而不是并行模式 这就是为什

班上有

private final Map 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);

}
现在
如果在线程内调用此代码
可能会导致数据不一致、竞争条件等。这就是为什么
DefaultListableBeanFactory
内的所有方法在执行诸如
registerBeanDefinition
之类的操作时也会获取不同的锁(
以及使用ConcurrentHashMap


查看DefaultListableBeanFactory#registerBeanDefinition以获得更清晰的信息。ref链接。

因为
HashMap
不是线程安全的?(此外,可以使用注释而不是xml来定义bean,而且,好吧,这是现在更常见的方式)默认情况下,spring中的所有bean都是单例的。i、 e.应该只有一个bean实例。现在。假设您在两个不同的位置声明了相同的bean。在spring启动期间,它执行组件扫描并将所有bean放入该映射中。因此,如果两个线程扫描您创建的两个bean,那么这两个bean都有可能被插入。如果发生这种情况,那么同一个bean有两个实例。我相信为了避免这些情况,线程安全映射是有用的,我认为它与单例无关。更多的是关于bean注册代码,它将并行创建bean。
 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);

}