终于搞懂Spring中Scope为Request和Session的Bean了
之前只是很模糊的知道其意思,在request scope中,每个request创建一个新的bean,在session scope中,同一session中的bean都是一样的
但是不知道怎么用代码去验证它
今天可找到验证它的代码了
首先定义一个简单的类
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class HelloMessageGenerator {
    private String message;
    @Override
    public String toString() {
        return getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
    }
}
然后定义一个配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.annotation.RequestScope;
import org.springframework.web.context.annotation.SessionScope;
@Configuration
public class ScopesConfig {
    @Bean
    @RequestScope
    public HelloMessageGenerator requestScopedBean() {
        return new HelloMessageGenerator();
    }
    @Bean
    @SessionScope
    public HelloMessageGenerator sessionScopedBean() {
        return new HelloMessageGenerator();
    }
}
最后定义个控制类
import com.google.common.collect.Maps;
import java.util.Map;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/scopes")
@Slf4j
public class ScopesController {
    @Resource(name = "requestScopedBean")
    private HelloMessageGenerator requestScopedBean;
    @Resource(name = "sessionScopedBean")
    private HelloMessageGenerator sessionScopedBean;
    @GetMapping("/request")
    public Map<String, String> getRequestScopeMessage() {
        Map<String, String> result = Maps.newLinkedHashMap();
        result.put("message", requestScopedBean.getMessage());
        result.put("requestScopedBean", requestScopedBean.toString());
        requestScopedBean.setMessage("Good morning!");
        return result;
    }
    @GetMapping("/session")
    public Map<String, String> getSessionScopeMessage() {
        log.info("getSessionScopeMessage(), sessionScopedBean:{}", sessionScopedBean);
        Map<String, String> result = Maps.newLinkedHashMap();
        result.put("message", sessionScopedBean.getMessage());
        result.put("sessionScopedBean", sessionScopedBean.toString());
        sessionScopedBean.setMessage("Good morning!");
        return result;
    }
}
结果说明:
1. 对于请求:/scopes/request(request scope 请求地址),网页上的结果是:
对于任何一次请求,message为null,且requestScopedBean都不一致,所以是每个request都会重新创建一个bean
第一次请求:
{
      message: null,
      requestScopedBean: "HelloMessageGenerator@3ef0cae5"
}
之后的请求:
{
      message: null,
      requestScopedBean: "HelloMessageGenerator@c84a4f4"
}
2. 对于请求:/scopes/session(session scope 请求地址),网页上的结果始终是:
第一次请求,message为null,之后的每次请求message被置为Good morning!,并且sessionScopedBean固定为一个值,所以同一session下都使用着同一个bean
当重新换一个浏览器请求时,又会重复以上的操作
第一次请求:
{
      message: null,
      sessionScopedBean: "HelloMessageGenerator@f9f38d5"
}
之后的请求:
{
      message: "Good morning!",
      sessionScopedBean: "HelloMessageGenerator@f9f38d5"
}
spring-bean-scopes - baeldung
spring 组件@Scope(request,session)示例 - cnblogs
终于搞懂Spring中Scope为Request和Session的Bean了的更多相关文章
- 让你彻底搞懂JS中复杂运算符==
		让你彻底搞懂JS中复杂运算符== 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读了ECMA ... 
- Spring中如何获取request的方法汇总及其线程安全性分析
		前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性.下面话不多说了,来一起看看详细的介绍吧. 概述 在使用Spring MVC开发Web系统 ... 
- 这一次搞懂Spring事务注解的解析
		前言 事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发,解耦业务逻辑和系统逻辑.但是Spring事务原理是怎样?事务在方法间是如何传播的?为 ... 
- 来一轮带注释的demo,彻底搞懂javascript中的replace函数
		javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ... 
- 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
		作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ... 
- 一张图搞懂Spring bean的完整生命周期
		一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任何一个环节怎么操作bean的生成及修饰是非常有帮助的. ... 
- 轻松搞懂Java中的自旋锁
		前言 在之前的文章<一文彻底搞懂面试中常问的各种“锁”>中介绍了Java中的各种“锁”,可能对于不是很了解这些概念的同学来说会觉得有点绕,所以我决定拆分出来,逐步详细的介绍一下这些锁的来龙 ... 
- 终于搞懂了vue 的 render 函数(一) -_-|||
		终于搞懂了vue 的 render 函数(一) -_-|||:https://blog.csdn.net/sansan_7957/article/details/83014838 render: h ... 
- 彻底搞懂 JS 中 this 机制
		彻底搞懂 JS 中 this 机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 目录 this 是什么 this 的四种绑定规 ... 
随机推荐
- 想学好Python,你必须了解Python中的35个关键词
			每种编程语言都会有一些特殊的单词,称为关键词.对待关键词的基本要求是,你在命名的时候要避免与之重复.本文将介绍一下Python中的关键词.关键词不是内置函数或者内置对象类型,虽然在命名的时候同样也最好 ... 
- JavaWeb网上图书商城完整项目--day02-15.登录功能流程分析
			当用户点击登录界面的登录按钮的时候,将登录的用户名.密码和验证码上传到后台,后台的业务流程如下面所示: 
- Python3-设计模式-迭代器模式
			Python3中的迭代器 迭代器模式主要是访问集合元素的一中方式,迭代器不会把整个集合对象加载到内存,而是按照顺序将集合中的元素一个一个的进行迭代,这样每次迭代的时候只取少量的元素,比较省内存 注: ... 
- bug和测试报告思维导图
			Bug定义: 1.不符合需求的 2.程序本身的报错 3.不符合用户使用习惯的 Bug生命周期: 当我们测试人员提交一个bug的时候,自始bug就有它的生命周期,从开始到结束, 把测试的过程和结果写成文 ... 
- SpringBoot--整合Lettuce redis
			首先解释一下Lettuce客户端: Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连 ... 
- vue全家桶(4.1)
			5.状态管理 5.1.兄弟组件之间共享数据的问题? 首先,我们需要了解下兄弟组件之间如何共享数据的问题 完成下列需求: 1.点击按钮,改变商品数量 2.点击加入购物车,在购物车的这个div盒子里需要显 ... 
- jupyter lab最强代码补全插件
			1 简介 提起kite相信不少朋友都有印象,它是一个功能非常强大的代码补全工具,目前可用于Python与javascript,为许多知名的编辑器譬如Vs Code.Pycharm提供对应的插件. 图1 ... 
- excel把按行合并的单元格重新拆分
			前言 今天帮朋友弄她excel表格的数据,发现excel表格合并之后,再拆分就不再同一行里面了,导致后面想要拆分回来非常头痛,如下图(下面的数据是模拟的): 可以看到第一例和其他例中间部分为合并的,此 ... 
- Volatile关键字的解读
			原子性 定义: 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行. Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围 ... 
- css transparent属性_css 透明颜色transparent的使用
			在css中 transparent到底是什么意思呢? transparent 它代表着全透明黑色,即一个类似rgba(0,0,0,0)这样的值. 例如在css属性中定义:background:tran ... 
