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"),将其设置为多例模式。

  • 相关阅读:
    Oracle Words Spelling Error
    原创 分布式锁与应用场景
    原创 分布式事务简单实现思路
    原创 使用redis位图实现布隆过滤器
    原创 redis实现接口限流
    原创 jwt-security简单实现
    原创 抢购秒杀之redis高性能实现
    原创 springcloud feign优化配置
    原创 派单、抢单业务简单实现
    原创 微信公众号推送图片实现
  • 原文地址:https://www.cnblogs.com/jiazhutao/p/12675577.html
Copyright © 2011-2022 走看看