spring 的bean 作用域
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 作用域相关推荐
- rethat安装MySQL多例_Spring框架-Bean作用域中单例模式和多例模式的区别
Spring框架-Bean作用域中单例模式和多例模式的区别 一.单例模式的特点(当没有指定是单例模式还是多例模式的时候,默认是单例模式): 1.Spring容器创建的时候,对应的类的实例化对象一起被创 ...
- 【Spring】bean的作用域(@Scope) - singleton、prototype
已知spring 3+已拥有多种不同的作用域: singleton(默认).prototype.request.session.global session.(参考: spring中scope作用域( ...
- spring bean作用域_Spring面试知识点,这是我见过最全面的 - 知识铺
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停地来唤醒记忆深处的知识点. Q1.什么是Spring框架? Spring是最流行的企业应用程序框架之一.Spring ...
- Spring Bean作用域实例
在Spring中,bean作用域用于确定哪种类型的 bean 实例应该从Spring容器中返回给调用者.bean支持的5种范围域: 单例 - 每个Spring IoC 容器返回一个bean实例 原型- ...
- Spring中bean的五个作用域简介(转载)
Spring上个版本的IoC容器支持两个不同的bean作用域(单例与原型). Spring 2.0改进了这一点,不仅提供了一些依赖于Spring部署环境(比如说,在web环境中的request和ses ...
- Spring【Bean的作用域与生命周期】
Spring[Bean的作用域与生命周期]
- Spring Bean作用域与生命周期
目录 Bean的作用域: Bean有六大行为模式 1.singleton:单例模式(默认) 2.prototype: 原型模式(多例模式) 3.request: 请求作用域(Spring MVC) 4 ...
- Spring框架—③依赖注入DI、Bean作用域及自动装配
依赖注入 DI,Dependency injection 依赖: 指bean对象的创建依赖于Spring容器 注入: 指Bean对象所依赖的资源,由容器来设置和装配 在beans.xml中配置 1.常 ...
- spring:Bean作用域
在配置文件中定义Bean时,用户不但可以配置Bean的属性值及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响. spring 4.0中所支持的作用域: ...
- Spring IOC中 Bean 作用域
Spring Bean 作用域 Spring 3 中为Bean定义了5种作用域,它们是:singleton(单例).prototype(原型).request.session 和 global se ...
最新文章
- 反应特别慢_酶促反应与普洱茶的制作
- OWASP出品:Xenotix XSS漏洞测试框架及简单使用
- LNK2005 连接错误解决办法
- 自定义sql_一个简单易用的开源BI软件,专为SQL用户设计的开源库
- linux显卡内核修改,iTOP-4412开发板-驱动-linux显卡驱动的修改方法
- python set 和 ^ 的妙用
- 终端花屏后的恢复办法
- git个人常用的命令
- 斯维尔密码狗使用方法(附安装资源)
- Nero 软件各种组件简单介绍
- 制作uefi的kali安装盘_制作 UD + EFI + PE + KALI 启动U盘
- 重复抽样与不重复抽样的抽样平均误差大小?
- Neo4j 构建简单农业知识图谱(Agriculture KnowledgeGraph)
- linux 检查zip是否损坏,用-v参数 unzip -v test.zip 检查zip文件是否损坏代常亮
- Oracle EBS 值集获取段限定词SQL
- 什么是量子计算机 什么原理,量子计算机原理是什么?
- uni-app个人中心
- 火车站信息服务系统之LED大屏显示
- ACM巨全模板(上)
- Android基础入门教程——4.2.3 Service精通
热门文章
- 2019年2月10日训练日记
- 百度地图实现定位功能及城市选择
- Open vSwitch: Provider 网络
- 计算机技术对审计范围的影响,计算机技术对审计过程的影响分析
- 计算机辅助审计在外汇,外汇管理领域计算机辅助审计
- linux raid 卡日志,Linux系统下RAID卡异常日志收集方法、系统及存储介质与流程
- mongodb 日期分组聚合_MongoDB基于时间段的聚合查询
- 苹果CMS 改造四合一聚合影视+聚合直播+在线小说+短视频+在线音乐+电视直播
- Echarts 柱形图最全详解
- Excel表格身份证号码如何一键提取性别、年龄、出生年月