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

為了賬號安全,請及時綁定郵箱和手機立即綁定

Bean的作用域

Bean的作用域不是singleton,容器中只有一個實例,那么如果在BeanImplOne和BeanImplTwo里個有一個BeanInterfarce的對象。那么在BeanImplOne中,對它的BeanInterfac中的屬性做更改,在BeanImplTwo里的BeanInterface實例相應屬性的值也是會更改的么?

還是不會改變? 不會改變是什么原因,這是容器里一個Bean的實例的不同拷貝么?

正在回答

1 回答

變還是不變得看對應的那個對象的Scope。估計你是對scope有點疑惑,spring中每個scope類都實現了org.springframework.beans.factory.config.Scope接口,然后注冊到org.springframework.beans.factory.config.CustomScopeConfigurer中。每次獲取bean的時候底層都是訪問Scope來獲取的,你也可以定義自己的Scope。比如

public?class?ThreadScope?implements?org.springframework.beans.factory.config.Scope?{
????private?final?ThreadLocal<Map<String,?Object>>?SCOPE_THREAD?=?new?ThreadLocal()?{
????????@Override
????????protected?Object?initialValue()?{
????????????return?new?HashMap<String,?Object>();
????????}
????};

????@Override
????public?Object?get(String?name,?ObjectFactory<?>?objectFactory)?{
????????if?(SCOPE_THREAD.get().containsKey(name))?{
????????????return?SCOPE_THREAD.get().get(name);
????????}
????????SCOPE_THREAD.get().put(name,?objectFactory.getObject());
????????return?SCOPE_THREAD.get().get(name);
????}

????@Override
????public?Object?remove(String?name)?{
????????return?SCOPE_THREAD.get().remove(name);
????}

????//空實現代表不讓spring容器管理bean
????@Override
????public?void?registerDestructionCallback(String?s,?Runnable?runnable)?{

????}

????@Override
????public?Object?resolveContextualObject(String?s)?{
????????return?null;
????}

????@Override
????public?String?getConversationId()?{
????????return?null;
????}
}

然后注冊:

<bean?class="org.springframework.beans.factory.config.CustomScopeConfigurer">
????<property?name="scopes">
????????<map>
????????????<entry?key="thread">
????????????????<bean?class="xx.xx.xx.ThreadScope"></bean>
????????????</entry>
????????</map>
????</property>
</bean>

這樣就OK了,這個Scope就是每個線程的bean都是同一個

0 回復 有任何疑惑可以回復我~
#1

Bluewind001 提問者

非常感謝!
2015-10-04 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

Bean的作用域

我要回答 關注問題
微信客服

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

幫助反饋 APP下載

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

公眾號

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