1. 程式人生 > >Spring 核心 Ioc容器與Bean

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 註解.