Spring 核心 Ioc容器與Bean
注意我的 Spring 版本是 5.1.2.RELEASE, 並且主要使用註解配置. 如果你需要使用 xml 配置, 我想這篇文章應該不適合你.
IoC容器
IoC就是控制反轉, 也叫依賴注入(DI).
比如, 我們現在有 A B 兩個類, A 類依賴 B 類在容器在建立 Bean(物件) 的時候, 會注入這些依賴也就是將 B 物件注入到 A 物件中.
依賴注入方式
構造方法注入
private TestService testService; @Autowired public ScsController(TestService testService){ this.testService = testService; }
通過屬性注入
@Autowired
private TestService testService;
不管是根據構造方法注入還是通過屬性注入 @Autowired
註解都是必不可少的. @Autowired
註解預設是按照型別進行注入的, 如果沒有出現指定型別 Bean 時(TestService Bean) 測可以設定 required=false
表示在用到的時候進行注入.
有些情況下我們可能需要名稱進行注入, 可以配合 @Qualifier
註解一起使用.
@Autowired @Qualifier("testService") private TestService testService;
Bean
在 Spring 中, bean 是一個由 Spring IoC 容器例項化, 組裝和管理的物件.
容器幫我們管理的 Bean 都表示一個 BeanDefinition
物件, 這個物件的主要作用就是幫我們來描述 Bean 的 class 型別、建構函式引數列表、scope、屬性、依賴項等等. 當容器註冊 Bean 的時候就會使用 BeanDefinitionRegistry
來幫我們進行註冊; 當我們如果要從容器中獲取一個 Bean 時, 則需要使用 BeanFactory
.
也就是說 BeanDefinition
就是用來描述 Bean, BeanDefinitionRegistry
BeanDefinition
, BeanFactory
用來管理 Bean.
要注意的是 BeanFactory
採用延遲初始化策略: 只有當訪問容器中的某個物件時, 才對該物件進行初始化和依賴注入操作.
還有一個比它更高階的叫做 ApplicationContext
除了具有 BeanFactory
的所有能力之外, 還提供對事件監聽機制以及國際化的支援等.
ApplicationContext
構建在BeanFactory
上, 並且在容器啟動時全部完成初始化和依賴注入操作.
Bean 作用範圍(scope)
範圍 | 說明 |
---|---|
singleton | 這是預設Scope,表示在整個bean容器中或者說是整個應用中只會有一個例項。 |
prototype | 多例型別,表示每次從bean容器中都會獲取到一個對應bean定義全新的例項。 |
request | 僅適用於Web環境下的ApplicationContext,表示每一個HttpRequest生命週期內會有一個單獨的例項,即每一個Http請求都會擁有一個單獨的例項。 |
session | 僅適用於Web環境下的ApplicationContext,表示每一個HttpSession生命週期內會有一個單獨的例項,即每一個HttpSession下都會擁有一個單獨的例項,即每一個使用者都將擁有一個單獨的例項。 |
application | 僅適用於Web環境下的ApplicationContext,表示在ServletContext生命週期內會擁有一個單獨的例項,即在整個ServletContext環境下只會擁有一個例項。 |
websocket | 將單個bean定義範圍限定為WebSocket的生命週期。 僅在Web Spring ApplicationContext的上下文中有效。 |
可以通過註解 @Scope
進行指定
@Component
@Scope("prototype")
public class Hello {
}
如果作用範圍是 request
session
application
則可以使用相應的 @RequestScope
@SessionScope
@ApplicationScope
註解.