动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

为什么Spring MVC控制器是单例模式

08-27 17:21 63浏览
举报 T字号
  • 大字
  • 中字
  • 小字

Spring MVC作为目前主流的开发框架之一,Spring MVC的控制器更是其核心组件之一,很多人都以为Spring MVC的控制器是多例模式。那么到底Spring MVC控制器单例模式还是多例模式呢?事实上SpringMVC控制器默认是单例模式。那什么Spring MVC控制器是单例模式呢?

我们先来了解一下什么是单例模式:单例模式就是保证一个类只有一个实例,并且提供一个访问该实例的全局访问入口。比如Windows的任务管理器,以及本文的介绍Spring MVC控制器都是单例模式。

那么为什么Spring MVC控制器会采用单例模式呢?那当然是因为有优点啦,我们来看看Spring MVC控制器单例模式的优点:

1.减少了系统的性能开销,当一个对象需要产生时,当时消耗的资源较多。那么产生对象时构建的方式就可以通过单例去构建。

2.单例模式存在全局访问点,所以可以优化共享资源访问。

当然,Spring MVC控制器单例模式下也会出现一些不可避免的缺点:

controller中定义很多的属性,那么单例肯定会出现竞争访问,不同用户共享数据变量是不安全的。因此:不要在controller中定义成员变量。万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。

我们可以通过实例来说明Spring MVC控制器为什么是单例模式而不是多例模式,我们来看下测试用例:

package com.inchlifc.controller;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

  

/**

 * @Title:

 * @date:

 * @Description: 测试SpringMVC单例模式

 * @Company:

 */

@Controller

@RequestMapping("/hello")

public class HelloController {

 

    private int i = 1;

 

    @RequestMapping(value = "/test1")

    public void testSingle1() {

        ++i;

        System.out.println("test1-------"+i);

    }

 

    @RequestMapping(value = "/test2")

    public void testSingle2() {

        ++i;

        System.out.println("test2------"+i);

    }

}

这里我们新建一个Controller,定义变量i,初始化为1.项目启动,我们依次调用方法testSingle1()、testSingle2()再调用testSingle1()。通过结果我们会得出结论,单例模式下会共享普通成员变量和静态成员变量。

 

我们稍微修改一下代码,来看一下多例模式下的测试:

package com.inchlifc.controller;

 

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

 

 

/**

 * @Title:

 * @date:

 * @Description: 测试SpringMVC单例模式

 * @Company:

 */

@Controller

@Scope("prototype")

@RequestMapping("/hello")

public class HelloController {

 

    private int i = 1;

 

    @RequestMapping(value = "/test1")

    public void testSingle1() {

        ++i;

        System.out.println("test1-------"+i);

    }

 

    @RequestMapping(value = "/test2")

    public void testSingle2() {

        ++i;

        System.out.println("test2------"+i);

    }

}

重复上面的操作,最后我们得出的结论是多例模式下普通成员变量不共享,静态成员共享。

通过对比两次测试用例的结果,很明显对于Spring MVC控制器来说,单例模式下更具优势。因此,毫无疑问Spring MVC控制器是单例模式。想要了解更多的Spring MVC知识,欢迎观看本站的Spring MVC视频教程,里面有更多你想要问题的答案!

0人推荐
共同学习,写下你的评论
0条评论
袋子里的小女孩
程序员袋子里的小女孩

12篇文章贡献56226字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消