Java Springbean实例变量是否可以保存动态值(每个请求)

Java Springbean实例变量是否可以保存动态值(每个请求),java,spring,Java,Spring,我有一个springbean类(OrderUtil),如下所示,它有一个实例变量 public class OrderUtil { private boolean dynamicValue; public boolean isDynamicValue() { return dynamicValue; } public void setDynamicValue(boolean dynamicValue) { this.dynamicVal

我有一个springbean类(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)

}



}
问题:从api请求中,dynamicValue可以是true/false。我将这个动态值true/false设置为instance变量的事实是,如果同时有来自两个客户a(真值)和B(假值)的多个请求用例,则会提出一个问题


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

在@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);
    }
}

事实上,最好在@servicebean中使用一个具有默认作用域(singleton)的动态变量。 您的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);
    }
}

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

这里,每个Rest请求都有一个请求范围的bean,该bean在给定的请求中保持活动状态

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


您可以在这里参考以获得对Bean作用域的正确理解。

此问题基于Bean作用域,可以通过正确使用Bean作用域来解决

这里,每个Rest请求都有一个请求范围的bean,该bean在给定的请求中保持活动状态

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


您可以在这里查阅,以获得对Bean作用域的正确理解。

我认为您的问题是关于Bean作用域的,请阅读文档中的这一页以了解更多信息:。简而言之,默认情况下bean是单例的。您可能希望将作用域设置为
request
,以便每个请求具有不同的状态。我认为您的问题是关于bean作用域的,请阅读文档中的此页以了解更多信息:。简而言之,默认情况下bean是单例的。您可能希望将作用域设置为
request
,以便每个请求具有不同的状态。