>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 21645 个阅读者 刷新本主题
 * 贴子主题:  Spring MVC Controller单例陷阱 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-04-25 07:04:17     消息  查看  搜索  好友  邮件  复制  引用

  Spring MVC Controller默认是单例的:

单例的原因有二:
1、为了性能。
2、不需要多例。

1、这个不用废话了,单例不用每次都new,当然快了。
2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。
    我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。
    因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:

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:55
*/

@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 | 1
2 | 2
3 | 3
4 | 4


改为单例的:
0 | 0
1 | 0
2 | 0
3 | 0
4 | 0


从此可见,单例是不安全的,会导致属性重复使用。


最佳实践:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。






----------------------------
原文链接:https://blog.51cto.com/lavasoft/1394669



程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->集合(上)
  JavaWeb开发-->Web运作原理(Ⅲ)
  JSP与Hibernate开发-->域对象在持久化层的四种状态
  Java网络编程-->通过JavaMail API收发邮件
  精通Spring-->Vue CLI脚手架工具
  Vue3开发-->Vue CLI脚手架工具
  Marshalling在Netty中的使用
  Rust学习笔记 | 异步代码的几种写法
  Mybatis Plus 多租户架构(Multi-tenancy)实现
  使用Spring MVC多次读取请求Request Body的内容
  重新理解响应式编程
  Spring AOP的基本概念和注解
  拦截器不拦截静态资源的三种处理方法
  Spring Cloud构建微服务架构: 消息总线
  SpringCloud Gateway-整体流程
  Nginx技术探秘
  分布式消息队列RocketMQ部署与监控
  Spring配置日志
  nginx详解反向代理、负载均衡、LNMP架构上线动态网站
  Java-CORBA
  Hibernate拦截器与监听器
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。