zoukankan      html  css  js  c++  java
  • springMVC中的Controller里面定义全局变量

    使用SpringMVC的时候,如果想要在Controller中定义一个全局变量,并且实现在不同用户访问程序的时候,所得到的全局变量不一样的(线程安全的),这个时候就可以用Spring的注解@Scope来实现:

    @Controller 
    //把这个bean 的范围设置成session,表示这bean是会话级别的, 
    @Scope("session") 
    public class XxxController{ 
    private List<String> list ;

    //PostConstruct当bean加载完之后,就会执行init方法,并且将list实例化; 
    @PostConstruct 
    public void init(){ 
      list = new ArrayList<String>(); 
    }

    }

    当我们首次访问这个Controller的时候,他会根据判断这个会话是不是处于同一个session中,如果是一个新的,容器会执行init方法,如果一样就不会。

    下面简单说下@Scope这个注解的理解

    spring中bean的scope属性,有如下5种类型:

    singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例
    prototype表示每次获得bean都会生成一个新的对象
    request表示在一次http请求内有效(只适用于web应用)
    session表示在一个用户会话内有效(只适用于web应用)
    globalSession表示在全局会话内有效(只适用于web应用)
    在多数情况,我们只会使用singleton和prototype两种scope,如果在spring配置文件内未指定scope属性,默认为singleton。

    单例的原因有二:
    1、为了性能。

    2、不需要多例。

     --》单例不用每次都new,当然快了。

    --》不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。

      我这里说不需要的原因是看开发者怎么用了,如果你给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("/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
     

    最佳实践:定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。

  • 相关阅读:
    C#编程语言详解(第2版) 11.3 类和结构的区别
    .Net程序员如何快速成长之我见
    封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件,c#接收邮件
    POJ1163The Triangle
    hdoj_1231&&hdoj_1003最大连续子序列
    数组名++操作导致的_BLOCK_TYPE_IS_VALID
    《windows程序设计》第二章学习心得
    error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
    Windows环境下Unicode编程总结
    已知顺序表L递增有序,写一算法,将X插入到线性表的适当位置,以保持线性表的有序
  • 原文地址:https://www.cnblogs.com/jiazhutao/p/12675577.html
Copyright © 2011-2022 走看看