猿问

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

我有一个像下面这样的 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 code


orderUtil.setDynamicValue(dynamicValue)


}




}

问题:dynamicValue 可以来自 api 请求,为 true/false。事实上,我将此动态值 true/false 设置为实例变量,这在同时来自两个客户 A(真值)和 B(假值)的多个请求用例的情况下提出了一个问题。


想知道用户是否看到任何不一致的行为,即用户 B 的错误值行为出现在用户 A 的响应中?请协助


烙印99
浏览 125回答 2
2回答

郎朗坤

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

明月笑刀无情

这个问题是基于Bean作用域的,可以通过正确使用bean作用域来解决。这里,每个 Rest 请求都带有一个 Request Scoped bean,并且该 bean 在给定请求中保持活动状态。每个请求都会创建自己的线程,因此不会有任何您认为可能的差异,因为每个请求都会有一个动态值 true/false 值,该值在整个请求会话中都有效。
随时随地看视频慕课网APP

相关分类

Java
我要回答