springIoc中的單列物件的分析

2022-07-12 00:15:15 字數 1280 閱讀 3962

最近有個同事去面試,其中有乙個問題是關於spring單例的。本篇博文就發表一下小編我自己的理解~~。

使用過spring的程式猿應該都知道,我們的bean(controller、service和dao,實體bean除外)都是通過spring的ioc

容器統一管理的,同時這些bean都是預設單例的,即乙個bean在乙個ioc容器中就只有乙個例項。這一點跟設計模式中

的單例略有不同,在單例模式中的單例是在整個應用中只有乙個例項。

我們把bean放在ioc容器中統一進行管理,只在初始化載入的時候例項化一次,一方面提高了效率,另一方面大大降

低了記憶體開銷。spring的依賴反轉原則降低了程式之間的耦合性,也提交了我們的開發效率,不用每次都手動去new

了。單例模式確實有很多優點,但是說到單例我們就會想到執行緒安全,併發訪問情況下spring中bean是執行緒安全的嗎?

到底是不是執行緒安全的,要根據實際場景判斷。為什麼這麼說呢?首先,大多數時候客戶端都在訪問我們應用中

的業務物件,而這些業務物件並沒有做執行緒的併發限制,因此不會出現各個執行緒之間的等待問題,或是死鎖問題。這

一部分不在考慮。

再有就是成員變數這一重要因素了。在併發訪問的時候這些成員變數將會是併發執行緒中的共享物件,也是影響線

程安全的重要因素。成員變數又分為基本型別的成員變數和引用型別的成員變數。

其中引用型別的成員變數即我們在controller中注入的service,在service中注入的dao,這裡將其定義為成員變數主

要是為了例項化進而呼叫裡面的業務方法,在這些類中一般不會有全域性變數,因此只要我們的業務方法不含有獨立的

全域性變數即使是被多執行緒共享,也是執行緒安全的。

再有就是基本型別成員變數,剛剛說了service層和dao層一般不會有全域性變數,這裡主要針對於controller層。基本

型別成員變數的定義又分為兩種情況:如果此成員變數是final型別修飾的不可被修改的,則仍是執行緒安全的。另外一

種情況就是不安全的了,解決方法:要麼把全域性變數定義成區域性的, 要麼修改controller的單例模式把它定義成

prototype型別的。從文中開始我們就提到過,實體bean不是單例的,並沒有交給spring來管理,每次我們都手動去new

乙個例項。從客戶端傳遞到後台的controller-->service-->dao,這乙個流程中,即使處理我們提交資料的業務處理類是被

多執行緒共享的,但是他們處理的資料並不是共享的,資料是每乙個執行緒都有自己的乙份,所以在資料這個方面是不會

出現執行緒同步方面的問題的。

針對spring單例以上僅是個人意見,歡迎來**。

spring ioc 建立物件的方式

一 無參建構函式 bean id user class com.wt.pojo.user property name name value tom bean 二 含參建構函式 1 通過 name 鍵值對 bean id teacher class com.wt.pojo.teacher constr...

spring IOC建立物件方式

1.無參構造方法建立 1.1建立乙個實體類user public class user public void setname string name override public string tostring 1.2在配置檔案中註冊 1.3測試 public class mytest 1.4執...

Python 物件導向 單列模式

1 什麼是單例模式 乙個類有且只能建立乙個物件空間,目的是為了節約記憶體資源 例如 站 資料庫操作類 只需要乙個物件就能完成所有的功能,沒有必要建立多個物件浪費記憶體資源.2.實現單例模式 class singleton object 類屬性 instance none isinit false 是...