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的引用地址當然也是同一個。
循環依賴的弊端:垃圾回收的時候,不會回收循環依賴的對象,造成內存泄漏。但是單例對象倒還好,不會佔用太多內存,因此是可以容忍的。