Spring默认采用单例(Singleton)作用域,因此同一类的Bean在IoC容器中仅存在一个共享实例;getBean()多次调用返回的是同一个对象引用,这也是构造器日志仅打印一次的根本原因。
spring默认采用单例(singleton)作用域,因此同一类的bean在ioc容器中仅存在一个共享实例;`getbean()`多次调用返回的是同一个对象引用,这也是构造器日志仅打印一次的根本原因。
在您提供的代码中,DependencyA 和 DependencyB 均未显式声明作用域,因此遵循Spring默认规则:@Component 注解的Bean默认为 singleton 作用域。这意味着:
这正是Spring三级缓存机制发挥作用的典型场景:
| 缓存层级 | 名称 | 存储内容 | 在循环依赖中的角色 |
|---|---|---|---|
| 一级缓存 | singletonObjects | 完全初始化完毕的成品Bean(可用Bean) | 最终对外提供、getBean() 默认返回来源 |
| 二级缓存 | earlySingletonObjects | 提前曝光的半成品Bean(已实例化,未初始化) | 供其他Bean提前引用,避免死锁 |
| 三级缓存 | singletonFactories | ObjectFactory 工厂对象 | 按需生成早期引用,保障字段/Setter注入可打破循环 |
✅ 您的案例属于“单例 + Setter注入”循环依赖,Spring完全支持:
因此,两次 getBean() 调用本质是获取容器中已就绪的单例对象,而非新建实例。
⚠️ 注意事项:
// ✅ 正确验证原型行为(将导致循环依赖报错)@Component@Scope("prototype") // ← 添加此注解后,启动将失败class DependencyA { /* ... */ }
总结:getBean() 不创建新实例,而是从容器中共享已有单例——这是Spring高效复用资源的核心设计,也是理解循环依赖能否被解决的前提。合理利用作用域、注入方式与缓存机制,才能写出健壮、可维护的Spring应用。
Ruby实现二分搜索(二分查找)算法的简单示例
Muse Spark 1.2 Contributor 模型说明:价格、数据约定与用途
Muse Spark 2026 版本时间线与规格:1.1 至 1.3 能力梳理
Muse AI 官网入口与登录方法:账号设置及常见问题
Muse Spark 1.2 实测表现:基准数据、编程能力与版本选择
Muse Spark 1.1 API 费用解析:输入、输出与缓存计费