>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring》、《Spring Cloud Alibaba微服务开发零基础入门到实操》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 27213 个阅读者 刷新本主题
 * 贴子主题:  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开发-->Servlet技术详解(Ⅰ)
  JSP与Hibernate开发-->Java应用分层架构及软件模型
  Java网络编程-->创建非阻塞的HTTP服务器
  精通Spring-->通过Axios访问服务器
  Vue3开发-->CSS过渡和动画
  Redis为什么单线程能够支持高并发
  说一下Spring @Autowired 注解自动注入流程
  Spring API中JAVA反射—工具类ReflectionUtils
  WebFlux 响应式编程初体验
  SSE(Server Sent Events) HTTP服务端推送详解 - hadoop_a9bb...
  Spring AOP的基本概念和注解
  Spring MVC关于分页的简单实现
  RESTful架构和RESTful API设计总结
  开发一个Java项目的基本流程
  Java软件架构设计七大原则
  Spring+JPA+ehcache开启二级本地缓存
  Spring Cloud 服务发布与调用
  酒店评论数据分析和挖掘-展现数据分析全流程:报告展示篇
  Spring MVC:切面的应用
  Java-CORBA
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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