为了账号安全,请及时绑定邮箱和手机立即绑定

spring bean实例变量可以保存动态值(每个请求)

spring bean实例变量可以保存动态值(每个请求)

烙印99 2023-06-28 15:26:20
我有一个像下面这样的 spring bean 类(OrderUtil),它有一个实例变量public class OrderUtil {    private boolean dynamicValue;public boolean isDynamicValue() {        return dynamicValue;    }    public void setDynamicValue(boolean dynamicValue) {        this.dynamicValue = dynamicValue;    }}我在不同的类中自动装配这个 util 类public class RestService {        @Autowired    private OrderUtil orderUtil;@POST    @Path("order/{orderNumber}")    @Produces( { MediaType.APPLICATION_JSON })    public Response getOrderDetails( @QueryParam("dynamicValue") boolean dynamicValue){//some codeorderUtil.setDynamicValue(dynamicValue)}}问题:dynamicValue 可以来自 api 请求,为 true/false。事实上,我将此动态值 true/false 设置为实例变量,这在同时来自两个客户 A(真值)和 B(假值)的多个请求用例的情况下提出了一个问题。想知道用户是否看到任何不一致的行为,即用户 B 的错误值行为出现在用户 A 的响应中?请协助
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

事实上,最好在 @Service bean 中使用默认范围(单例)的动态变量。您的 REST 组件有一个请求范围。您还需要提供一个线程保存变量,例如使用 AtomicBoolean


@Service

class OrderUtil {

    private static final AtomicBoolean dynamicValue = new AtomicBoolean();


    public boolean isDynamicValue() {

        return dynamicValue.get();

    }


    public void setDynamicValue(boolean v) {

        dynamicValue.set(v);

    }


    //think about it https://en.wikipedia.org/wiki/Compare-and-swap

    public boolean casDynamicValue(boolean expect, boolean update) {

        return dynamicValue.compareAndSet(expect, update);

    }

}


查看完整回答
反对 回复 2023-06-28
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这个问题是基于Bean作用域的,可以通过正确使用bean作用域来解决。

这里,每个 Rest 请求都带有一个 Request Scoped bean,并且该 bean 在给定请求中保持活动状态。

每个请求都会创建自己的线程,因此不会有任何您认为可能的差异,因为每个请求都会有一个动态值 true/false 值,该值在整个请求会话中都有效。

查看完整回答
反对 回复 2023-06-28
  • 2 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信