前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring5系列(六) | Controller到底线程安全么

Spring5系列(六) | Controller到底线程安全么

作者头像
一缕82年的清风
发布2021-12-06 09:51:29
2870
发布2021-12-06 09:51:29
举报
文章被收录于专栏:lsqingfeng

本篇文章比较简单,主要介绍下关于对象的scope, 其实一直有一道比较经典的面试题,问的是springMVC中的Controller是单例的么?我们就从这道题来引申出来。

我们在学习java基础的时候,都会学到一种设计模式,叫做单例设计模式。什么叫做单例设计模式呢,就是要保证我们创建出来的对象永远只有一个。为什么要这样呢,主要目的就是为了合理的利用内存。有些比较重量级的对象其实创建一次就可以了,那么我们就可以使用单例设计模式。什么样的情况不能使用单例呢,那就是存在线程安全的问题的类,或者说存在共享资源可能被多个线程进行操作时,就不能使用单例设计模式。关于单例设计模式的实现方式这里就不展开了。

我们前面在讲解FactoryBean这个接口的时候,提到过里边有三个需要实现的方法,最常用的方法是getObject(),这个也是最核心的方法,用来获取复杂对象。其中还有一个方法叫做

代码语言:javascript
复制
boolean isSingleton(); 

这个方法返回布尔类型值,如果返回结果为true, 代表会返回一个单例对象,也就是多次获取都是同一个对象。如果返回的false, 多次获取,每次都是新的对象。这是FactoryBean为我们提供的方法,那么我们正常的被spring管理的对象能否像isSingleton() 方法一样,可以控制对象的创建次数呢。当然是可以的,通过<bean> 标签中的scope属性来指定。我们以之前的User类为例。

代码语言:javascript
复制
<bean id="user" class="com.xxx.User" scope="singleton" />
复制代码

这个时候我们创建出来的对象就是单例的,不管调用多少次,得到的都是同一个对象。我们可以在测试类中演示。

代码语言:javascript
复制
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");

User u1 = (User)ctx.getBean("user");
User u2 = (User)ctx.getBean("user");

System.out.println(u1);
System.out.println(u2);

复制代码

观察结果可以发现打印的地址值是一样的,代表是同一个对象。那么如果我们想要非单例对象,也就是每次获取都是一个新的对象该如何处理呢,只需把scope改为prototype。

代码语言:javascript
复制
<bean id="user" class="com.xxx.User" scope="prototype" />
复制代码

再次执行上面的测试方法打印地址不同,说明是不同对象。

这里要注意,scope的默认值是singleton。也就是在不指定scope的情况下得到的也是单例对象。

那么对于使用工厂创建的对象如何指定呢。

  1. 对于实现FactoryBean的工厂,通过实现isSingleton() 方法指定
  2. 对于实例工厂和静态工厂,也是通过scope来指定。

如果不清楚什么是实例工厂和静态工厂,快去看下我的上一篇文章。 那么我们在来讲解下,到底什么样的对象用单例,什么时候不用单例呢?

单例的,一般就是比较耗资源的,且没有线程安全问题的,比如

  1. sqlSessionFactory
  2. DAO
  3. Service

对于非单例的:像数据库的连接和会话,对于每个线程之间需要有一定隔离性,否则事务胡乱提交会产生问题的,就需要使用非单例。比如:

  1. Connection
  2. SqlSession | Session
  3. Struts2 ACtion

好了最后,我们再回到最初的问题,spring中的Controller是单例的么? 答案是肯定的,因为Controller也是spring管理的一个Bean, 默认就是单例的。那继续提问, Controller是线程安全的么, 其实并不是,由于单例的模式,就会被多个线程同时使用,所以我们要尽量避免在Controller中定义成员变量,以免引发线程安全问题。

好了本篇文章就介绍到这里。喜欢的话,收藏加关注,学习不迷路。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档