springboot默认创建的bean是单实还是多例

曾经面试的时候有面试官问我spring的controller是单例还是多例,结果我傻逼的回答当然是多例,要不然controller类中的非静态变量如何保证是线程安全的,这样想起似乎是对的,但是不知道(主要是我没看过spring的源码,不知道真正的内在意图)为什么spring的controller是单例的。

先看看spring的bean作用域有几种,分别有啥不同。

spring bean作用域有以下5个:

singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;

prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;

====下面是在web项目下才用到的===

request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听

session:每次会话,同上

global session:全局的web域,类似于servlet中的application

好了,上面都说了spring的controller默认是单例,那很自然就是singleton了。

再看一个例子,看看单例会不会有我说的那种问题(就是类中定义的非静态变量线程安全问题),当然下面这个例子我是实验过的, 要不然也不敢发出来

为什么spring要默认是单例呢?原因有二:

1、为了性能。

2、不需要多例。

1、这个不用废话了,单例不用每次都new,当然快了。

2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。

我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。

因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:

@Controller

public class MultViewController {   

    private int index = 0;//非静态

    @RequestMapping("/show")

    public String toShow(ModelMap model) {

        System.out.println(++i);

        return"show";

    }

    @RequestMapping("/test")

    public String test() {

        System.out.println(++i);

        return"test";

    }

}

从此可见,单例是不安全的,会导致属性重复使用。

最佳实践:

1、不要在controller中定义成员变量。

2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式

spring 的bean 作用域相关推荐

  1. rethat安装MySQL多例_Spring框架-Bean作用域中单例模式和多例模式的区别

    Spring框架-Bean作用域中单例模式和多例模式的区别 一.单例模式的特点(当没有指定是单例模式还是多例模式的时候,默认是单例模式): 1.Spring容器创建的时候,对应的类的实例化对象一起被创 ...

  2. 【Spring】bean的作用域(@Scope) - singleton、prototype

    已知spring 3+已拥有多种不同的作用域: singleton(默认).prototype.request.session.global session.(参考: spring中scope作用域( ...

  3. spring bean作用域_Spring面试知识点,这是我见过最全面的 - 知识铺

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停地来唤醒记忆深处的知识点. Q1.什么是Spring框架? Spring是最流行的企业应用程序框架之一.Spring ...

  4. Spring Bean作用域实例

    在Spring中,bean作用域用于确定哪种类型的 bean 实例应该从Spring容器中返回给调用者.bean支持的5种范围域: 单例 - 每个Spring IoC 容器返回一个bean实例 原型- ...

  5. Spring中bean的五个作用域简介(转载)

    Spring上个版本的IoC容器支持两个不同的bean作用域(单例与原型). Spring 2.0改进了这一点,不仅提供了一些依赖于Spring部署环境(比如说,在web环境中的request和ses ...

  6. Spring【Bean的作用域与生命周期】

    Spring[Bean的作用域与生命周期]

  7. Spring Bean作用域与生命周期

    目录 Bean的作用域: Bean有六大行为模式 1.singleton:单例模式(默认) 2.prototype: 原型模式(多例模式) 3.request: 请求作用域(Spring MVC) 4 ...

  8. Spring框架—③依赖注入DI、Bean作用域及自动装配

    依赖注入 DI,Dependency injection 依赖: 指bean对象的创建依赖于Spring容器 注入: 指Bean对象所依赖的资源,由容器来设置和装配 在beans.xml中配置 1.常 ...

  9. spring:Bean作用域

    在配置文件中定义Bean时,用户不但可以配置Bean的属性值及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响. spring 4.0中所支持的作用域: ...

  10. ​Spring IOC中 Bean 作用域

    ​Spring Bean 作用域 Spring 3 中为Bean定义了5种作用域,它们是:singleton(单例).prototype(原型).request.session 和 global se ...

最新文章

  1. 反应特别慢_酶促反应与普洱茶的制作
  2. OWASP出品:Xenotix XSS漏洞测试框架及简单使用
  3. LNK2005 连接错误解决办法
  4. 自定义sql_一个简单易用的开源BI软件,专为SQL用户设计的开源库
  5. linux显卡内核修改,iTOP-4412开发板-驱动-linux显卡驱动的修改方法
  6. python set 和 ^ 的妙用
  7. 终端花屏后的恢复办法
  8. git个人常用的命令
  9. 斯维尔密码狗使用方法(附安装资源)
  10. Nero 软件各种组件简单介绍
  11. 制作uefi的kali安装盘_制作 UD + EFI + PE + KALI 启动U盘
  12. 重复抽样与不重复抽样的抽样平均误差大小?
  13. Neo4j 构建简单农业知识图谱(Agriculture KnowledgeGraph)
  14. linux 检查zip是否损坏,用-v参数 unzip -v test.zip 检查zip文件是否损坏代常亮
  15. Oracle EBS 值集获取段限定词SQL
  16. 什么是量子计算机 什么原理,量子计算机原理是什么?
  17. uni-app个人中心
  18. 火车站信息服务系统之LED大屏显示
  19. ACM巨全模板(上)
  20. Android基础入门教程——4.2.3 Service精通

热门文章

  1. 2019年2月10日训练日记
  2. 百度地图实现定位功能及城市选择
  3. Open vSwitch: Provider 网络
  4. 计算机技术对审计范围的影响,计算机技术对审计过程的影响分析
  5. 计算机辅助审计在外汇,外汇管理领域计算机辅助审计
  6. linux raid 卡日志,Linux系统下RAID卡异常日志收集方法、系统及存储介质与流程
  7. mongodb 日期分组聚合_MongoDB基于时间段的聚合查询
  8. 苹果CMS 改造四合一聚合影视+聚合直播+在线小说+短视频+在线音乐+电视直播
  9. Echarts 柱形图最全详解
  10. Excel表格身份证号码如何一键提取性别、年龄、出生年月