本篇文章为大家展示了如何验证中春天的控制器是单例还是多例,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
弹簧管理的控制器,即加入@ Controller注入的类,默认是单例的,因此建议:
1,不要在控制器中定义成员变量;(单例非线程安全,会导致属性重复使用)
2,若必须要在控制器中定义一个非静态成员变量,则通过注解@Scope (“prototype"),将其设置为多例模式。
验证代码:
包com.ausclouds.bdbsec.tjt; 进口org.springframework.stereotype.Controller; 进口org.springframework.web.bind.annotation.GetMapping; 进口org.springframework.web.bind.annotation.RequestMapping; 进口org.springframework.web.bind.annotation.ResponseBody;/* * * @author tjt * @time 2020-08-25 * @desc验证控制器的单例 */@ controller @ResponseBody @RequestMapping (“/tjt") 公开课TestSingleController { 私人长期资金=10; @GetMapping (“/test1") 公共长testSingleOne () {=+ +钱; System.out.println (“/tjt/test1:钱我:“+钱); 退货; } @GetMapping (“test2") 公共长testSingleTwo () {=+ +钱; System.out.println (“/tjt test2:钱我:“+钱); 退货; } }
首先,访问<代码> http://localhost: 8088/test1> 代码,得到的答案是11> 代码;<代码>
接着,再访问<代码> http://localhost: 8088/test2> 代码,得到的答案是1 <代码> 2> 代码;
不难看出:同一个变量,两次访问得到不同的结果,很明显是线程不安全的。
验证截图:
尽量不要在控制器中定义成员变量,若必须要在控制器中定义一个非静态成员变量,则通过注解@Scope (“prototype"),将其设置为多例模式,或者是在控制器中使用ThreadLocal变量。
验证代码:
包com.ausclouds.bdbsec.tjt; 进口org.springframework.context.annotation.Scope; 进口org.springframework.stereotype.Controller; 进口org.springframework.web.bind.annotation.GetMapping; 进口org.springframework.web.bind.annotation.RequestMapping; 进口org.springframework.web.bind.annotation.ResponseBody;/* * * @author tjt * @time 2020-08-25 * @desc验证控制器的单例 */@ controller @ResponseBody @Scope (“prototype")//将控制器设置为多例模式 @RequestMapping (“/tjt") 公开课TestSingleController { 私人长期资金=10; @GetMapping (“/test1") 公共长testSingleOne () {=+ +钱; System.out.println (“/tjt/test1:使用后@Scope钱我:“+钱); 退货; } @GetMapping (“test2") 公共长testSingleTwo () {=+ +钱; System.out.println (“/tjt/test2:使用后@Scope钱我:“+钱); 退货; } }
在加上@Scope (“prototype")后首先,访问<代码> http://localhost: 8088/test1> 代码,得到的答案是11> 代码;<代码>
接着,再访问<代码> http://localhost: 8088/test2> 代码,得到的答案也是11> 代码;<代码>
不难看出:同一个变量,两次访问得到相同的结果。
验证截图:
其实,Spring bean的作用域除了上面使用的原型外,还有singleton,请求、会话和全球会话四种,其中请求、会话和全球会话主要运用在Web项目中。
- <李>单例模式:单例模式,当春天创建applicationContext容器的时候,春天会预初始化所有的该作用域实例,加上lazy-init就可以避免预处理,李> <李>原型:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后弹簧将不再对其管理,李> <李>要求:每次请求都新产生一个实例,和原型不同就是创建后,接下来的管理,春天依然在监听;李> <李>会话:每次会话,同上;李> <李>全球会话:全局的网络域类似于servlet中的应用。李>
上述内容就是如何验证中春天的控制器是单例还是多例,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。