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

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

如何配置 Bean 原型范圍提供程序以在 Bean 創建時使用會話信息?

如何配置 Bean 原型范圍提供程序以在 Bean 創建時使用會話信息?

胡說叔叔 2023-06-21 15:55:43
每次訪問代理以獲取實例時,我都需要提供基于會話信息的 bean。我怎樣才能做到這一點?現在我嘗試了以下。例如:第一個類定義了一個會話范圍的 bean。@Component@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)public class BeanSession implements Serializable {    private Serializable rootState;    public <T extends Serializable> T getRootState() {        return (T) rootState;    }    public void setRootState(Serializable rootState) {        this.rootState = rootState;    }}第二類有一些與他們的領域相關的邏輯,也知道如何提供信息。必須每次都創建 bean,因為信息在線程處理期間可能會發生變化。因此,每次Attribute1訪問時,我一定會得到包含新信息的 bean。@Servicepublic class Attribute1Service {    @Resource    private BeanSession beanSession;    public void setDefaultValue() {        Configuration configuration = beanSession.getRootState();        configuration.getAttribute1().setValue("VALUE 1");    }    @Bean    public Attribute1 attribute1() {        Configuration configuration = beanSession.getRootState();        return configuration.getAttribute1();    }}最后,第三個類聲明attribute1as 依賴項來執行自己的邏輯。@Servicepublic class Attribute2Service {    @Resource    private BeanSession beanSession;    @Resource    private Processor processor;    @Resource    private Attribute1 attribute1;    public void defineAttribute2() {        Configuration configuration = beanSession.getRootState();        String value = processor.getValue(configuration, attribute1);        configuration.getAttribute2().setValue(value);    }    public void defineAttribute3() {        Configuration configuration = beanSession.getRootState();        String value = processor.getValue(configuration, attribute1);        configuration.getAttribute3().setValue(value);    }}我不想從頭開始訪問信息attribute1,因為這會在信息提供者和消費者之間造成硬耦合。beanSessionAttribute2Service
查看完整描述

2 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

異常說明了一切 - attribute1 bean 是在應用程序初始化期間創建的(通過會話作用域 bean),但沒有與請求綁定的線程。您還應該代理您的 attribute1 bean,因為您將其注入到單例(屬性 2 服務。)



查看完整回答
反對 回復 2023-06-21
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

基于 Alexander.Furer 給出的見解。我創建了自己的作用域,并管理它來調用 bean 提供者,以便在Attribute1方法的每次訪問中都擁有新鮮的 bean。


為此,我擴展了以下范圍:


// Register scope as "runtime"

public class RuntimeScope implements Scope {


    @Override

    public Object get(String name, ObjectFactory<?> objectFactory) {

        return objectFactory.getObject();

    }


    ...

}

新Attribute1服務:


@Service

public class Attribute1Service {


    @Resource

    private BeanSession beanSession;


    public void setDefaultValue() {

        Configuration configuration = beanSession.getRootState();

        configuration.getAttribute1().setValue("VALUE 1");

    }


    @Bean

    @Scope(value = "runtime", proxyMode = ScopedProxyMode.TARGET_CLASS)

    public Attribute1 attribute1() {

        Configuration configuration = beanSession.getRootState();

        return configuration.getAttribute1();

    }


}

消費者Attribute2服務:


@Service

public class Attribute2Service {


    @Resource

    private BeanSession beanSession;


    @Resource

    private Processor processor;


    @Resource

    private Attribute1 attribute1;


    public void defineAttribute2() {

        Configuration configuration = beanSession.getRootState();

        String value = processor.getValue(configuration, attribute1.getValue()); // Will call Attribute1 service to require the fresh bean

        configuration.getAttribute2().setValue(value);

    }


    public void defineAttribute3() {

        Configuration configuration = beanSession.getRootState();

        String value = processor.getValue(configuration, attribute1.getValue()); // Will call Attribute1 service to require the fresh bean

        configuration.getAttribute3().setValue(value);

    }


}

我沒有看到的問題是 Attribute1 應該是處理 bean 實例化的代理。因此,通過創建我自己的范圍,我可以保證訪問 attribute1(由Attribute2Servicewith生成attribute1.getValue())方法將創建一個新的 bean(由 提供Attribute1Service)。


查看完整回答
反對 回復 2023-06-21
  • 2 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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