1. 概述
Bean 是 Spring 框架中的一個關鍵概念。因此,理解這個概念對於掌握框架並以有效的方式使用它至關重要。
不幸的是,對於“Spring Bean 到底是什麼”這個簡單問題,並沒有明確的答案。一些解釋過於深入,導致忽略了整體框架,而另一些則過於模糊。
本教程將嘗試闡明這個問題,首先從官方文檔中的描述入手。
2. Bean 定義
在 Spring 框架文檔 中,Bean 的定義如下:
在 Spring 中,由 Spring IoC 容器管理並構成了應用程序核心的對象被稱為 Bean。Bean 是指由 Spring IoC 容器實例化、組裝以及其他方式管理的對象。
這個定義簡潔明瞭 但未能詳細闡述一個重要的組成部分:Spring IoC 容器。 讓我們更深入地瞭解它以及它為應用程序帶來的好處。
3. 控制反轉
簡單來説,控制反轉 (IoC) 是一種 過程,其中對象定義其依賴項,而無需創建它們。 這種對象將創建這些依賴項的任務委託給 IoC 容器。
我們先聲明一些領域類,然後再深入瞭解控制反轉。
3.1 領域類
假設我們有一個類聲明:
public class Company {
private Address address;
public Company(Address address) {
this.address = address;
}
// getter, setter and other properties
}這個類需要一個類型為<em>Address</em>的協作對象:
public class Address {
private String street;
private int number;
public Address(String street, int number) {
this.street = street;
this.number = number;
}
// getters and setters
}3.2. 傳統方法
通常,我們使用類構造函數創建對象:
Address address = new Address("High Street", 1000);
Company company = new Company(address);這種方法沒有問題,但如果能夠更好地管理依賴關係會怎麼樣呢?
想象一下,一個應用程序包含數十甚至數百個類。有時我們希望在整個應用程序中共享一個類的單個實例,有時則需要為每個用例創建一個單獨的對象,等等。
管理如此多的對象簡直是一場噩夢。這正是控制反轉發揮作用的地方。
與其自己構造依賴關係,一個對象可以從 IoC 容器中檢索其依賴關係。我們只需要為容器提供適當的配置元數據。
3.3. Bean 配置
首先,讓我們使用 @Component 註解裝飾 Company 類:
@Component
public class Company {
// this body is the same as before
}以下是一個配置類,它向 IoC 容器提供 Bean 級聯信息:
@Configuration
@ComponentScan(basePackageClasses = Company.class)
public class Config {
@Bean
public Address getAddress() {
return new Address("High Street", 1000);
}
}配置類產生一個類型為<em>Address</em>的 Bean。它還攜帶了<em>@ComponentScan</em>註解,指示容器在包含<em>Company</em>類的包中查找 Bean。
當 Spring IoC 容器構造這些類型的對象時,所有對象都被稱為 Spring Bean,因為它們由 IoC 容器進行管理。
3.4. 在行動中使用 IoC
由於我們已經在配置類中定義了 Bean,我們需要一個 AnnotationConfigApplicationContext 類的實例來構建容器:
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);一個快速測試驗證了我們的 Bean 的存在以及屬性值。
Company company = context.getBean("company", Company.class);
assertEquals("High Street", company.getAddress().getStreet());
assertEquals(1000, company.getAddress().getNumber());結果證明 IoC 容器已正確創建和初始化了 Bean。
4. 結論
本文對 Spring Bean 以及它們與 IoC 容器的關係進行了簡要描述。