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视频教程,里面有更多你想要问题的答案!
QCode09-04 14:38
Code大师09-04 14:50
不写代码你养我啊08-23 11:14
不写代码你养我啊09-17 18:02
要学习了06-18 18:13