spring概念理解

alias

<alias name="person" alias="person2"></alias>

挺早之前,如果我要對一個別人定義好的bean起一個別名,而我沒有修改applicationContext.xml的權限,那麼我可以在另一個配置文件裏使用別名alias。

scope

spring中的對象其實只有兩種作用域,單例和每次都new出一個對象。

  • singleton
  • prototype

而websocket,request,session和application這四種scope中,對象也是單例的,他們和singleton的不同,只在於對象和socket鏈接,請求,會話或者應用這四種生命週期綁定了。

簡單舉個例子,在一次請求中,一個bean的scope=request,那麼該對象在這次請求中是單例的。但是與另一個請求中的相應的bean不是同一個對象。

循環依賴(cyclic reference)

假設有三個類A,B,C。A依賴B,B依賴C,C依賴A,如此形成了循環依賴。那麼Spring是如何幫我們創建有循環依賴的類的呢?

  • 當三個類都是prototype,不能創建成功
  • 當至少一個類是singleton,可以創建成功

spring實例化對象的機制:單例模式的對象,在spring中會被直接實例化;而prototype的會檢查引用,如果有引用對象沒有被實例化,暫停實例化,去實例化引用對象。
若A是單例的,B是原型的。那麼兩次get出的A的bean,a1和a2的引用b1和b2是同一個對象。其實很好理解,並不是說B變成了單例的,而是因爲a1和a2本就是一個對象,二者對於B的引用地址當然也是同一個。
循環依賴的弊端:垃圾回收的時候,不會回收循環依賴的對象,造成內存泄漏。但是單例對象倒還好,不會佔用太多內存,因此是可以容忍的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章