Spring Bean 作用域 主要瞭解 singleton 和 prototype 就好了,他們分別使用 單例模式 和 原型模式 | 來源 | 說明 | | | | | singleton | 預設作用域,一個BeanFactory有且僅有一個實例(並不是在JVM進程里是唯一的) | | prot ...
Spring Bean 作用域
主要瞭解 singleton
和 prototype
就好了,他們分別使用 單例模式 和 原型模式
來源 | 說明 |
---|---|
singleton | 預設作用域,一個BeanFactory有且僅有一個實例(並不是在JVM進程里是唯一的) |
prototype | 原型作用域,每次以來查找和依賴註入生成新的Bean對象 |
request | 將Spring Bean存儲在ServletRequest上下文中 |
session | 將Spring Bean存儲在HttpSession中 |
application | 將Spring Bean 存儲在ServletContext中 |
依賴查找: 比較 singleton 和 prototype 兩種作用域
結論: 使用依賴查找時,singleton會拿到相同的對象,prototype 會拿到不同的對象
首先我們將User對象通過 singleton 和prototype 兩種方式分別註入到容器中
我們三次拿到User對象,比較結果(比較name屬性)
觀察可以看到,使用 singleton 作用域拿到的是相同的對象,prototype 作用域拿到的是不同的對象
依賴註入 比較 singleton 和 prototype 兩種作用域
結論:singleton 作用域拿到的是相同的對象,prototype 作用域拿到的仍然是不同的對象
通過@Autowired方式依賴查找對象
把他們列印出來看看,這樣子會報錯,因為容器中有重覆的對象,而我們沒有指定哪個是primary
如果我們使用 @Qualifier 註解指定要註入的對象名稱,就不會報錯了
輸出結果如下:可以看到,singleton 作用域拿到的是相同的對象,prototype 作用域拿到的仍然是不同的對象
依賴註入集合時 singleton 和 prototype 作用域的比較
結論:集合中會同時存在一份 singleton bean 和 prototype bean
使用@Autowired直接註入map集合
輸出,列印,可以看到 singleton 和 prototype 作用域的對象同時存在
singleton 和 prototype 作用域的生命周期方法的回調情況
結論:
singleton 和 prototype 都會執行初始化方法回調
但僅 singleton 會執行銷毀方法回調
為了方便看到 beanName,User類實現了 BeanNameAware 介面,並定義了 初始化 和 銷毀方法,具體如下:
我們仍然使用依賴註入集合的方式同時拿到 singleton 和 prototype 作用域中的 User bean,並將他們輸出
輸出看看,可以看到 prototype bean 的銷毀方法並沒有被回調