【发布时间】:2018-08-14 08:21:50
【问题描述】:
在DefaultListableBeanFactory类中有
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
存储 bean 定义的位置。我是 Spring 新手,我不明白为什么 IoC 容器需要哈希图的并发性。据我了解,我们只是从 XML 文件中读取 bean 定义并将它们存储在 hashmap 中。
我们为什么不使用常规的HashMap 来达到目的?
【问题讨论】:
-
因为
HashMap不是线程安全的? (此外,可以使用注释而不是 xml 来定义 bean,而且,AFAIK,这是现在更常见的方式) -
默认情况下spring中的所有bean都是Singleton。即应该只有一个bean实例。现在。假设您在两个不同的地方声明了同一个 bean。在 spring 启动期间,它会进行组件扫描并将所有 bean 放入此映射中。因此,如果两个线程扫描您创建的两个 bean,则两者都有可能被插入。如果发生这种情况,那么就有同一个 bean 的两个实例。我相信为了避免这些情况,使用线程安全映射
-
我觉得跟单例关系不大。它更多的是关于将并行创建 bean 的 bean 注册代码。
标签: java spring ioc-container