springMVC的controller的全局变量是单例还是非单例? spring mvc 的Controller类是单例的吗
springMVC的controller的全局变量是单例还是非单例?
spring的controller默认是单例的。
spring的bean作用域有5个,如下:
singleton:单例模式,当spring创建applicationContext容器的时候,spring会初始化所有的该作用域实例,加上lazy-init就可以避免预处理。
prototype:原型模式,每次通过getBean获取该bean就会产生一个新的实例,创建后spring将不再对齐进行管理。
request:每次请求都会产生一个新的实例,和prototype不同的是,创建以后spring依然在监听。
session:每次会话,同上。
spring的controller默认是单例,原因有二:
(1)为了性能:单例不用每次都创建
(2)不需要多例:只要controller中不定义属性,那么单例完全是安全可用的,如果定义了,那单例肯定会出现竞争访问;非要定义,则通过注解@Scope("prototype"),将其设置为多例模式。
spring mvc 的Controller类是单例的吗
spring3中的controller默认是单例的,若是某个controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变量a,则,在别的请求中能够读到这个修改的内容。
若是在@controller之前增加@Scope("prototype"),就可以改变单例模式为多例模式
Spring的controller默认是单例,多个用户同时访问会不会冲突
没太明白你的意思,但是我简单说明一下,struts会为每一个请求开启一个线程的,所以你说的问题根本不存在,当然假如会有线程不安全的情况,你的问题还是可以避免,比如不要声明全局变量,那么就不会出现问题, 你可以简单的去看看关于内存分配的相关内容
spring mvc controller 是不是单例
我们知道Spring MVC是多线程单实例的MVC框架,就是说,对于同一个Controller,只会生成一个实例来处理所有的请求,因此bean实例只会实例化一次,并被存放在工厂中,以供其他请求使用
今天发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变量a,则,在别的请求中能够读到这个修改的内容。
若是在@controller之前增加@Scope("prototype"),就可以改变单例模式为多例模式
单例的原因有二:
1、为了性能。
2、不需要多例。
1、这个不用废话了,单例不用每次都new,当然快了。
2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。
我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。
因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:
1
1
1
1
1
1
1
1
1
20
2
2
2
2
2
2
2
2
30
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:5
*/
@Controller
@RequestMapping("/demo/lsh/ch5")
@Scope("prototype")
public class MultViewController {
private static int st = 0 //静态的
private int index = 0 //非静态
@RequestMapping("/show")
public String toShow(ModelMap model) {
User user = new User()
user.setUserName("testuname")
user.setAge("23")
model.put("user", user)
return "/lsh/ch5/show"
}
@RequestMapping("/test")
public String test() {
System.out.println(st " | " index )
return "/lsh/ch5/test"
}
}
0 | 0
1 |
2 |
3 |
4 |
改为单例的:
0 | 0
1 | 0
2 | 0
3 | 0
4 | 0
从此可见,单例是不安全的,会导致属性重复使用。
最佳实践:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式
Spring 单例模式无效
那就说明Spring没有实例化这个对象,意味着你的Spring配置不正确,造成Spring无法注入对象,也造成了无状态bean的失效。例如没有加入Spring的会话工厂,没有加入IoC的xml支持,没有假如AOP支持,或者Spring的某些包导入错误,都会造成这种异常,我推荐你把你的配置文件和使用的jar列举出来,然后你的测试类是否引入了Spring的getBean。
一个最简单的 spring boot restful 例子。
建议你这样试试看:
1. 在 Eclipse 中新一个 maven 工程。
2. 修改 pom.xml 文件添加如下内容:
3.
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-test
test
1.
jdk-1.
true
1.
1.1.1.
org.springframework.boot
spring-boot-maven-plugin
4. 添加 Application 类:
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args)
}
}5. 添加 HelloController 类:
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/welcome")
public String welcome() {
return "Hello World!"
}
}然后运行。
Spring中Controller线程问题?
spring中controller默认是单实例的,但是多线程的。
多线程调用同一个实例而已。
Thread.currentThread().sleep(2000)这个阻塞方法只是针对当前线程进行睡眠的,
并不会影响其他线程的执行。
sleep是针对线程来操作的,不同的线程互不影响。