java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Boot单例模式

Spring Boot的单例模式实现代码

作者:程序员飞鱼

Spring Boot里的单例不是GoF意义上的全JVM 唯一对象 + 私有构造器,而是由 Spring 容器管理的每个 ApplicationContext 仅一个实例,本文介绍Spring Boot的单例模式是如何实现的,感兴趣的朋友跟随小编一起看看吧

Spring Boot 里的单例不是 GoF 意义上的全 JVM 唯一对象 + 私有构造器。

而是由 Spring 容器管理的每个 ApplicationContext 仅一个实例

其本质是 IOC 容器用缓存表保存已创建的 Bean,并在 getBean() 时复用。

默认就是单例

@Component // 等价于 @Scope("singleton")
public class UserService {}

容器如何保证只有一个

核心在 DefaultSingletonBeanFactory/DefaultSingletonBeanRegistry三级缓存与同步控制:

创建流程(简化):

  1. getBean(name) → 若在 singletonObjects 里,直接返回。
  2. 不在 → 标记“正在创建”,调用 createBean() 完成实例化、依赖注入、BeanPostProcessor 等。
  3. 初始化完成后放入 singletonObjects,清理二/三级缓存,返回单例。
  4. 全过程对同名 bean 的创建有同步锁,避免并发重复创建,并通过早期引用解决 A→B→A 的构造/注入级循环依赖

何时创建

线程安全与可见性

@Bean@Configuration 的细节

经验:配置类间若互调 @Bean 方法,保持默认 proxyBeanMethods=true 或避免直接互调。

常见误区

最小验证

@SpringBootTest
class DemoTest {
    @Autowired UserService a;
    @Autowired ApplicationContext ctx;

    @Test void sameInstance() {
        UserService b = ctx.getBean(UserService.class);
        assertSame(a, b); // 同一容器内是同一个实例
    }
}

小结

Spring Boot 的单例= 默认 scope + BeanFactory 单例缓存 + 同步创建 +(必要时)早期曝光

把唯一性交给容器,比手写 GoF 单例更易测、更可控,也能与 AOP、生命周期、条件化装配等机制无缝协作。

到此这篇关于Spring Boot的单例模式实现代码的文章就介绍到这了,更多相关Spring Boot单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文