首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何在Spring中优雅的使用单例模式?

如何在Spring中优雅的使用单例模式?

作者头像
关忆北.
发布2021-12-07 16:31:35
发布2021-12-07 16:31:35
7.8K0
举报
文章被收录于专栏:关忆北.关忆北.
返璞归真

单例模式设计模式之初,是脱发的万恶之源,手动滑稽。

Java使用构造方法去创建对象可以有三种方式:

  • 使用new关键字
  • 使用Class.getInstance(通过反射调用无参构造方法)
  • 使用Constructor.newInstance(实则也是通过反射的方式调用任何构造方法)

单例模式私有化了构造方法,所以其他类无法使用通过new的方式去创建对象,在其他类使用该类的实例时,只能通过getInstance去获取。但是可以通过Constructor反射的方式获取私有化的构造器然后通过构造方法去创建对象。

单例模式

单例模式提供了创建对象的最佳方式:一个类有且仅有一个实例&&该实例可共享。

所以,单例模式便解决了频繁创建对象、销毁对象的问题,减少系统资源占用,让GC略微尴尬。

Spring下使用单例模式

最成功的单例并不是双重检验锁,而是枚举,枚举本身就是一种单例,并且无法使用反射攻击,再一个最优雅的是Spring本身实现的单例:

常用Spring中 @Repository@Component@Configuration @Service注解作用下的类默认都是单例模式的,所以,我目前认为在Spring下使用单例最优的方式是将类@Component注册为组件。使用场景主要有:数据库配置、Redis配置、权限配置、Filter过滤、webMvcConfig、swagger及自定义的时间转换器、类型转换器、对接第三方硬件时,调用硬件的dll、so文件等。

@Configurateion底层注解的定义是: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component 题外话:单独使用@Component注解,只能控制到类上,使用@Configuration+@Bean可以控制到方法级别粒度,但是尽量避免@Component+@Bean组合使用,因为@Component+@Bean并不是单例,在调用过程中可能会出现多个Bean实例,导致蜜汁错误。 并不是所有的注解默认都是单例模式,@RestController就是多例

注解单例的原因----Spring实现单例的原因

把类注册为组件Bean后,从运行开始到结束,类只加载到内存一次,类进行初始化,该组件的生命周期就交由Spring容器管理,声明为单例的组件在Spring容器只会实例化一个Bean,多次请求中复用同一个Bean,Spring会先从缓存的Map中查询是否存在该Bean,如果不存在才会创建对象。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 返璞归真
  • 单例模式
  • Spring下使用单例模式
  • 注解单例的原因----Spring实现单例的原因
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档