文档章节

spring的controller默认是单例还是多例

尾生
 尾生
发布于 2017/02/15 19:47
字数 711
阅读 78
收藏 0

曾经面试的时候有面试官问我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中不定义属性,那么单例完全是安全的。下面给个例子说明下:

 

package com.lavasoft.demo.web.controller.lsh.ch5;

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

/**

 * Created by Administrator on 14-4-9.

 *

 * @author leizhimin 14-4-9 上午10:55

 */

@Controller

@RequestMapping("/demo/lsh/ch5")

public class MultViewController {

    

    privateintindex = 0;         //非静态

    @RequestMapping("/show")

    publicStringtoShow(ModelMap model) {

        System.out.println(++i);

        return"/lsh/ch5/show";

    }

    @RequestMapping("/test")

    publicStringtest() {

        System.out.println(++i);

        return"/lsh/ch5/test";

    }

}

默认单例的

1 | 2

改为多例的(就是在class上面加一个@Scope("request")):

1 | 1

 

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

 

最佳实践:

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

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

本文转载自:http://blog.csdn.net/gengchenliang/article/details/26681295

共有 人打赏支持
尾生
粉丝 15
博文 137
码字总数 54687
作品 0
杭州
程序员
struts2多例springMVC单例

struts2的控制类action是多例的 springMVC的控制器类Controller是单例的 struts2和springMVC区别在于对数据的处理不同,struts2以属性形式绑定数据,因此必须多例才不会数据混乱。 springMV...

LYQ1990
2016/05/24
158
0
Spring MVC Controller单例陷阱

Spring MVC Controller默认是单例的: 单例的原因有二: 1、为了性能。 2、不需要多例。 1、这个不用废话了,单例不用每次都new,当然快了。 2、不需要实例会让很多人迷惑,因为spring mvc官...

动听的椰子
2016/02/29
94
0
JAVA 并发编程- Spring 并发访问的线程安全性问题

首先对于Spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一个对象。 spring...

袁梓皓
2016/03/02
110
0
Java MVC框架性能比较 jsp、struts1、struts2、springmvc3 (转帖)

Java MVC框架性能比较 jsp、struts1、struts2、springmvc3 现在各种MVC框架很多,各框架的优缺点网络上也有很多的参考文章,但介绍各框架性能方面差别的文章却不多,本人在项目开发中,感觉到...

CsOH913
2016/01/14
144
0
Struts action的单例与多例

struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实...

supperman
2012/07/16
0
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx防盗链、访问控制、Nginx解析PHP相关配置、Nginx代理

Nginx防盗链 在配置文件里写入以下内容: 用curl测试 访问控制 Nginx限制某些IP不能访问或者只允许某些IP访问。 配置文件写入如下内容: allow 表示允许访问的IP,deny限制访问的IP。 匹配正...

黄昏残影
14分钟前
0
0
自己动手实现RPC服务调用框架

转载 TCP的RPC 引言 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者)、battercake-consumer(服务调用者)。 设计思路...

雨中漫步的鱼
17分钟前
0
0
Centos6.x安装之后的9件事

Centos6.x安装之后的9件事 这些不是必须都做的,只不过是我个人的习惯,在此记录一下。 1.修改yum源到国内 CentOS系统更换软件安装源 备份你的原镜像文件,以免出错后可以恢复。 mv /etc/yu...

叶云轩
22分钟前
5
0
springboot2 使用jsp NoHandlerFoundException

开发图片上传功能,为验证测试功能是否正常,使用JSP编写表单提交进行测试 开发完成后,请求API提示如下异常: No mapping found for HTTP request with URI [/WEB-INF/jsp/avatar_upload.j...

showlike
28分钟前
0
0
springboot踩坑记--springboot正常启动但访问404

一 spring boot的启动类不能直接放在main(src.java.main)这个包下面,把它放在有包的里面就可以了。 二 正常启动了,但是我写了一个controller ,用的@RestController 注解去配置的controlle...

onedotdot
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部