终于搞懂Spring中Scope为Request和Session的Bean了
2024-09-03 14:42:17
之前只是很模糊的知道其意思,在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
最新文章
- TimerToPdf
- 谈谈php里的DAO Model AR
- Inversion_树状数组***
- 【前端】String.prototype.match() 用法详解
- python数据类型之list
- 【转】各种字符串Hash函数比较
- Spring4.0学习笔记(7) —— 通过FactoryBean配置Bean
- oracle关键字(保留字)
- C++—this指针的用法
- 一种数据与逻辑分离的Python单元测试工具
- Java小问题
- entity framework 上下文对象跟踪相关
- Python赋值运算符
- 无后缀名伪静态路径在IIS7.0的网站提示 ";404 - File or directory not found";
- Swift3翻天覆地的改变
- Leetcode题库——40.组合总和II
- python测试开发django-32.admin后台多对多关系ManyToManyField
- [JavaScript] 将字符串数组转化为整型数组
- 关于微信小程序的场景值
- Ubuntu命令行下安装、卸载、管理软件包的方法
热门文章
- [ C++ ] 勿在浮沙筑高台 —— 内存管理(18~31p) std::alloc
- linux网络编程-posix条件变量(40)
- redis基础二----操作List类型
- Java Agent(上)
- 彻底搞懂Redis主从复制原理及实战
- docx.opc.exceptions.PackageNotFoundError: Package not found at &#39;文件名.docx&#39; 问题解决
- 入门大数据---Hive的搭建
- vueX基础知识笔记
- Python抓取国家医疗费用数据:国家名、人均开销
- Android 用视频做页面背景