为什么 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.
在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.