当前位置:
网络安全 > 【第49期】面试官:SpringMVC的控制器是单例吗?
【第49期】面试官:SpringMVC的控制器是单例吗?
2022 年 5 月 17 日下午 3:46
•
面试问题 •
读12
点击上方“Java面试题精选”,关注公众号
面试时画图,查漏补缺
>>额外编号:以前的面试题,10道为单位,放在这个公众号菜单栏->面试题中。有需要的欢迎您浏览。
对于springMVC Controller单实例和多实例,下面给出一个例子。
第一次:类是多个实例,一个普通属性和一个静态属性。
结果:
普通属性:0............静态属性:0 普通属性:0............静态属性:1 普通属性:0…………静态属性:2 普通属性:0…………静态属性:3
所以:对于多个实例来说,普通属性不会被共享,不会产生任何影响。对于静态属性,该属性将被共享。
第二次:类改为单例
结果:
普通属性:0…………静态属性:0 普通属性:1…………静态属性:1 普通属性:2…… ……静态属性:2 普通属性:3…………静态属性:3
所以:对于单例情况,普通属性和静态属性都将被共享。
第三次:去掉类中的@Scope注解
结果:
普通属性:0…………静态属性:0 普通属性:1…………静态属性:1 普通属性:2…… ……静态属性:2 普通属性:3…………静态属性:3
所以:springmvc默认是单例的。
另外,还可以通过其他方式打印
输出结果为
跳转到其他方法不会得到初始值,但会共享这个属性。
总结
尽量不要在控制器中定义属性。如果特殊情况需要定义属性,可以在类中添加注解@Scope("prototype"),并将其改为多实例模式。
以前struts是根据类的属性来开发的。定义的属性可以是整个类通用的,所以默认是多个实例。否则,多线程访问肯定会共享类中的属性值,这肯定是不安全的。然而,springmvc是基于方法的。在开发中,形式参数用于接收值。当方法结束时,参数将被销毁。多线程访问会生成一块内存空间,里面的参数不会共享。所有的springmvc默认都使用单例。因此,不适合在控制器中的类中定义属性。只要控制器中没有定义属性,单例就是完全安全的。 springmvc这样设计的主要原因是为了提高程序的性能并且以后程序的维护只是为了业务维护。如果struts中定义的属性太多,你将不知道哪个方法使用了这个属性。以后维护程序还是很麻烦的。的。
仍然存在一个问题:它是线程安全的吗?如果您知道,请留言寻求答案。
来源:
www.sychzs.cn/qq_27026603/article/details/67953879
最后五期
【第44期】盘点那些必问的数据结构算法题:二分查找算法
【第45期】盘点数据结构算法必问题基本排序
【第46期】盘点那些必问的数据结构算法题:快速排序
【第47期】二叉树面试六类题总结及答案
【第48期】盘点Netty面试常见问题:Netty的零拷贝是什么?
而不是在网上搜索问题?还不赶快关注我们吧~
版权声明:本文内容由网友自愿贡献,本文所表达的观点仅代表作者自己的观点。本网站仅提供信息存储空间服务,不拥有任何所有权,也不承担相关法律责任。如果您发现本站有任何涉嫌侵权/非法内容,请发送邮件举报。一经核实,该网站将立即删除。
本文由斑马博客整理。本文链接为:https://www.sychzs.cn/index.php/post/6697.html