赞
踩
在Spring框架中,Bean的生命周期管理是其核心功能之一。当Spring容器启动时,它会根据配置信息(如XML配置文件、注解等)来创建和管理Bean实例。这些Bean实例默认会被放置在一个Map数据结构中,以便容器能够快速地根据Bean的名称(或ID)来查找和访问它们。
在Spring的源码中,Bean实例的存储和管理主要依赖于DefaultSingletonBeanRegistry
类。这个类内部使用了一个名为singletonObjects的Map<String, Object>来
存储单例Bean实例。当容器首次请求某个Bean时,它会检查这个Map中是否已经存在对应的实例。如果存在,则直接返回该实例;否则,容器会创建新的Bean实例,并将其添加到singletonObjects
中。
// DefaultSingletonBeanRegistry.java private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); // ... public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { // ... 省略部分代码 ... Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { synchronized (this.singletonObjects) { // 再次检查,防止并发问题 singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { // 创建新的Bean实例 singletonObject = singletonFactory.getObject(); // 将新创建的Bean实例添加到singletonObjects中 this.addSingleton(beanName, singletonObject); } } } return singletonObject; } // ... protected void addSingleton(String beanName, Object singletonObject) { synchronized (this.singletonObjects) { this.singletonObjects.put(beanName, singletonObject); } }
由于Bean实例是存储在Map中的,因此Bean的ID(或名称)必须是唯一的。这确保了容器能够准确地根据ID来查找和访问对应的Bean实例。在Spring的配置文件中,每个标签都必须具有一个唯一的id属性(或name属性,它可以是多个ID的别名)。
Spring Bean的生命周期包括多个阶段,如实例化、属性注入、初始化、使用、销毁等。在这个过程中,Bean实例与Map之间的关系主要体现在以下几个方面:
singletonObjects
Map中(对于单例Bean而言)。这样,后续的请求就可以直接从Map中获取该实例,而无需重新创建。singletonObjects
Map中进行查找。如果找到了对应的实例,则直接返回;否则,容器会尝试创建新的实例并添加到Map中。singletonObjects
Map中移除该Bean的实例。这样可以确保内存得到及时释放,并防止后续的请求访问到已经销毁的Bean实例。Spring通过使用Map数据结构来存储和管理Bean实例,实现了对Bean生命周期的高效管理。这种设计不仅提高了容器的性能,还确保了Bean实例的安全性和可维护性。对于高级Java工程师而言,深入理解Spring Bean Map的工作原理以及它与Bean生命周期的关系,将有助于更好地掌握Spring框架的使用和优化技巧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。