java spring scope_终于搞懂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 getRequestScopeMessage() {

Map result = Maps.newLinkedHashMap();

result.put("message", requestScopedBean.getMessage());

result.put("requestScopedBean", requestScopedBean.toString());

requestScopedBean.setMessage("Good morning!");

return result;

}

@GetMapping("/session")

public Map getSessionScopeMessage() {

log.info("getSessionScopeMessage(), sessionScopedBean:{}", sessionScopedBean);

Map 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"

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值