springboot默认创建的bean是单例

大家好,欢迎来到我的博客.这里主要是和大家分享it(java方面的技术))

springboot默认创建的bean是单例

spring bean作用域有下面几种
singleton:单例模式,当spring创建applicationContext容器的时候,spring会初始化所有的该作用域的实例,加上lazy-init就可以避免预处理
prototype:原型模式,每次通过getbean获取bean会创建产生一个实例,创建后spring将不再对其进行管理;
request:搞过web开发的人都知道request域,request域每次的请求都会产生一个新的实例,和prototype不同就是创建后,接下来的管理,spring依然在监听.
session:每次会话,spring依然在进行监听.
globalsession :全局的web域,类似于servlet的application.
spring创建controller默认是单例,原因有两个,
1.为了性能
2不需要多例
单例的好处是不用每次都进行new,当然快了,
这里说的不需要多例,主要还是看开发者怎样进行使用,如果弄得controller中定义了很多的属性,那么单例肯定的会会出现线程不安全的问题.
因此我们在controller中不要定义属性,那么单例的controller就是线程安全的了.
下面给出一个例子.
@Controller
public class MultViewController {
private int index = 0;//非静态
@RequestMapping("/show")
public String toShow(ModelMap model) {
System.out.println(++i);
return"show";
}
@RequestMapping("/test")
public String test() {
System.out.println(++i);
return"test";
}
}

来源于https://www.cnblogs.com/wenhuang/p/9784419.html
从此可以看出,单例的是不安全的,会导致属性的重复使用.
总结:我们在使用spring创建的controller中,不要在controller中定义成员的 变量.
万一必须要定义的话,则通过注解@scope(“prototype”)将其设置为多例.

猜你喜欢

转载自blog.csdn.net/q1252320343/article/details/90144284