springIoc中的单列对象的分析
最近有个同事去面试,其中有一个问题是关于spring单例的。本篇博文就发表一下小编我自己的理解~~。
使用过spring的程序猿应该都知道,我们的bean(controller、service和Dao,实体bean除外)都是通过spring的IoC
容器统一管理的,同时这些bean都是默认单例的,即一个bean在一个IoC容器中就只有一个实例。这一点跟设计模式中
的单例略有不同,在单例模式中的单例是在整个应用中只有一个实例。
我们把bean放在IOC容器中统一进行管理,只在初始化加载的时候实例化一次,一方面提高了效率,另一方面大大降
低了内存开销。spring的依赖反转原则降低了程序之间的耦合性,也提交了我们的开发效率,不用每次都手动去new
了。单例模式确实有很多优点,但是说到单例我们就会想到线程安全,并发访问情况下spring中bean是线程安全的吗?
到底是不是线程安全的,要根据实际场景判断。为什么这么说呢?首先,大多数时候客户端都在访问我们应用中
的业务对象,而这些业务对象并没有做线程的并发限制,因此不会出现各个线程之间的等待问题,或是死锁问题。这
一部分不在考虑。
再有就是成员变量这一重要因素了。在并发访问的时候这些成员变量将会是并发线程中的共享对象,也是影响线
程安全的重要因素。成员变量又分为基本类型的成员变量和引用类型的成员变量。
其中引用类型的成员变量即我们在controller中注入的service,在service中注入的dao,这里将其定义为成员变量主
要是为了实例化进而调用里面的业务方法,在这些类中一般不会有全局变量,因此只要我们的业务方法不含有独立的
全局变量即使是被多线程共享,也是线程安全的。
再有就是基本类型成员变量,刚刚说了service层和dao层一般不会有全局变量,这里主要针对于controller层。基本
类型成员变量的定义又分为两种情况:如果此成员变量是final类型修饰的不可被修改的,则仍是线程安全的。另外一
种情况就是不安全的了,解决方法:要么把全局变量定义成局部的, 要么修改controller的单例模式把它定义成
prototype类型的。从文中开始我们就提到过,实体bean不是单例的,并没有交给spring来管理,每次我们都手动去new
一个实例。从客户端传递到后台的controller-->service-->Dao,这一个流程中,即使处理我们提交数据的业务处理类是被
多线程共享的,但是他们处理的数据并不是共享的,数据是每一个线程都有自己的一份,所以在数据这个方面是不会
出现线程同步方面的问题的。
针对spring单例以上仅是个人意见,欢迎来探讨。
springIoc中的单列对象的分析的更多相关文章
- Ajax中的XMLHttpRequest对象详解
XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...
- [百度空间] [转] 在 Visual C++ 中控制全局对象的初始化顺序
from: http://blog.csdn.net/classfactory/archive/2004/08/07/68202.aspx 在 C++ 中,同一个翻译单位(.cpp文件)里的全局对象的 ...
- 详解JavaScript中的Object对象
Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是 ...
- Lucene中的 Query对象
"Lucene中的 Query对象": 检 索前,需要对检索字符串进行分析,这是由queryparser来完成的.为了保证查询的正确性,最好用创建索引文件时同样的分析器. quer ...
- HQL查询——查询返回对象类型分析
关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(Str ...
- Java EE中的容器和注入分析,历史与未来
Java EE中的容器和注入分析,历史与未来 java中的容器 java中的注入 容器和注入的历史和展望 一.java中的容器 java EE中的注入,使我们定义的对象能够获取对资源和其他依赖项的引用 ...
- IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...
- Java中arraylist和linkedlist源代码分析与性能比較
Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...
- R语言学习笔记1——R语言中的基本对象
R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...
随机推荐
- JAVA-阿里云短信服务
1.引入相关依赖 <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> < ...
- Java内部类的四种分类以及作用介绍
内部类内容解析 内部类的区分 内部类分别有成员内部类.局部内部类.匿名内部类.静态内部类,接下来将分别介绍. 成员内部类 就是位于外部类成员位置的类.与外部类的属性.方法并列. 成员内部类作为外部类的 ...
- 10. webdriver调用javascript
webdriver提供了操作浏览器的前进和后退的方法,但是对于浏览器公东条并没有提供相应的操作方法.于是就需要借助JavaScript来控制浏览器的滚动条.webdriver提供了execute_sr ...
- Journal of Proteome Research | Utilization of the Proteome Data Deposited in SRMAtlas for Validating the Existence of the Human Missing Proteins in GPM (解读人:梁嘉琪)
文献名:Utilization of the Proteome Data Deposited in SRMAtlas for Validating the Existence of the Human ...
- JSP+Servlet+JDBC+Mysql实现的天才会议管理系统
本文存在视频版本,请知悉 项目简介 项目来源于:https://github.com/hegexunmeng/meeting-system 这次分享一个会议管理系统,前端后端几乎没有使用任何框架,适合 ...
- Typora+markdown 最常用语法教程
Typora+markdown 最常用语法教程(by 程序员宝藏) Typora+markdown 最常用语法教程(by 程序员宝藏) 请先配置推荐配置(文件->偏好设置): 文章目录 Typo ...
- 3分钟学会简单使用Vim
Vim是一款运行在命令行里的文字编辑器,它是Linux人员的标配.在Windows环境下也可以有特别的用处,比如创建没有文件名的文件(.gitignore). Vim的功能十分强大,以至于有一些人对它 ...
- rabbitmq++:rabbitmq 三种常用的交换机
更多 rabbitmq 介绍 首先先介绍一个简单的一个消息推送到接收的流程,提供一个简单的图: 黄色的圈圈就是我们的消息推送服务,将消息推送到 中间方框里面也就是 rabbitMq的服务器: 然后经过 ...
- .NET 5.0 Preview 2发布
2020年4月2日微软.NET 团队的项目经理 Richard 在博客上 发布了.NET 5 Preview 2:https://devblogs.microsoft.com/dotnet/annou ...
- 【cs224w】Lecture 4 - 社区结构
Community 转自本人:https://blog.csdn.net/New2World/article/details/105328390 之前讲到了网络中节点扮演不同角色,而角色这个概念和社区 ...