在spring單例物件中使用多例物件

2021-10-18 20:29:02 字數 1095 閱讀 9270

需要在乙個單例物件a中使用多例成員變數b。

如果僅僅在多例中加上@scope(value = configurablebeanfactory.scope_prototype),由於a是乙個單例,所以無論如何b都是乙個單例。

在單例a中有乙個b類成員變數,b類通過@scope(value = configurablebeanfactory.scope_prototype, proxymode = scopedproxymode.target_class)註解標註這個類在a中是乙個多例實現。這時候即使a是乙個單例,b也會是乙個多例。b中定義了乙個inita(…)方法,初始化了b的成員變數,最終返回this。接著再次呼叫a的test()方法。

偽**如下:

@component

public

class

apublic

void

test01()

加了註解proxymode = scopedproxymode.target_class後,通過原始碼跟蹤發現每次呼叫b類中的方法時,觸發aop機制,將this用乙個新物件替換掉了,導致最終呼叫inita(…)得到的物件和呼叫test()的物件不是同乙個,導致後面新的物件沒有經過初始化,執行邏輯就會有問題。

小結一下

不加proxymode = scopedproxymode.target_class註解,單單使用@scope(value = configurablebeanfactory.scope_prototype)導致在單例a中b也一直是單例,因為a只初始化一次。

加入proxymode = scopedproxymode.target_class本質上加入了aop機制,對b類的方法呼叫前,都會建立新的物件,這就導致了無法使用同乙個物件連續兩次呼叫b類方法。

b類使用@scope(value = configurablebeanfactory.scope_prototype)註解標註,那怎麼解決b一直是個單例的問題呢?

在spring中使用quartz

好吧!我承認我對quartz並不熟悉,這種境況需要通過學習它,使用它去改變。先記錄下最進在spring中使用quartz的經驗。spring中提供了對quartz的支援,使得在spring使用quartz變得很容易,只需要在配置檔案中進行配置就行了。當然在路徑中要加入相應的jar包,我用的是quar...

在Spring中使用JMS

spring對jms進行封裝,使用起來更簡單。以下給出範例 供參考!在spring中可以用jmstemplate物件來傳送 接收訊息。1 連線工廠 在非web ejb容器中使用pool時,要手動stop,spring不會為你執行destroy method的方法。如果使用了pooledconnect...

在Spring中使用Quartz進行任務排程 1

概述 各種企業應用幾乎都會碰到任務排程的需求,就拿論壇來說 每隔半個小時生成精華文章的rss檔案,每天凌晨統計論壇使用者的積分排名,每隔30分鐘執行鎖定使用者解鎖任務。對於乙個典型的mis系統來說,在每月1號凌晨統計上個月各部門的業務資料生成月報表,每半個小時查詢使用者是否已經有快到期的待處理業務 ...