亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號