Spring Bean Map之舞

1. 引言

在Spring框架中,Bean的生命周期管理是其核心功能之一。当Spring容器启动时,它会根据配置信息(如XML配置文件、注解等)来创建和管理Bean实例。这些Bean实例默认会被放置在一个Map数据结构中,以便容器能够快速地根据Bean的名称(或ID)来查找和访问它们。


2. Spring Bean Map的创建

在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);  
    }  
}

3. Bean ID的唯一性

由于Bean实例是存储在Map中的,因此Bean的ID(或名称)必须是唯一的。这确保了容器能够准确地根据ID来查找和访问对应的Bean实例。在Spring的配置文件中,每个标签都必须具有一个唯一的id属性(或name属性,它可以是多个ID的别名)。


4. Bean生命周期与Map的关系

Spring Bean的生命周期包括多个阶段,如实例化、属性注入、初始化、使用、销毁等。在这个过程中,Bean实例与Map之间的关系主要体现在以下几个方面:

  1. 实例化与存储:当容器创建新的Bean实例时,它会将该实例添加到singletonObjects Map中(对于单例Bean而言)。这样,后续的请求就可以直接从Map中获取该实例,而无需重新创建。
  2. 查找与访问:容器在需要访问某个Bean时,会根据Bean的ID在singletonObjects Map中进行查找。如果找到了对应的实例,则直接返回;否则,容器会尝试创建新的实例并添加到Map中。
  3. 销毁与清理:当容器关闭或销毁某个Bean时,它会从singletonObjects Map中移除该Bean的实例。这样可以确保内存得到及时释放,并防止后续的请求访问到已经销毁的Bean实例。

5. 总结

Spring通过使用Map数据结构来存储和管理Bean实例,实现了对Bean生命周期的高效管理。这种设计不仅提高了容器的性能,还确保了Bean实例的安全性和可维护性。对于高级Java工程师而言,深入理解Spring Bean Map的工作原理以及它与Bean生命周期的关系,将有助于更好地掌握Spring框架的使用和优化技巧。


  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BrightChen666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值