当前位置:首页>开发>正文

springMVC的controller的全局变量是单例还是非单例? spring mvc 的Controller类是单例的吗

2023-07-05 07:36:29 互联网 未知 开发

 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是针对线程来操作的,不同的线程互不影响。

最新文章