如何實現一個簡易版的 Spring - 如何實現 @Component 註解
阿新 • • 發佈:2021-02-14
#### 前言
前面兩篇文章([如何實現一個簡易版的 Spring - 如何實現 Setter 注入](https://mp.weixin.qq.com/s/_gutNeGPMNKol-H0WYdl_Q)、[如何實現一個簡易版的 Spring - 如何實現 Constructor 注入](https://mp.weixin.qq.com/s/_ngnMW2r4GksFeXDLsl22A))介紹的都是基於 XML 配置檔案方式的實現,從 JDK 5 版本開始 Java 引入了註解支援,帶來了極大的便利,Sprinng 也從 2.5 版本開始支援註解方式,使用註解方式我們只需加上相應的註解即可,不再需要去編寫繁瑣的 XML 配置檔案,深受廣大 Java 程式設計人員的喜愛。接下來一起看看如何實現 Spring 框架中最常用的兩個註解(@Component、@Autowired),由於涉及到的內容比較多,會分為兩篇文章進行介紹,本文先來介紹上半部分 — **如何實現 @Component 註解**。
#### 實現步驟拆分
本文實現的註解雖然說不用再配置 XML 檔案,但是有點需要明確的是指定掃描 Bean 的包還使用 XML 檔案的方式配置的,只是指定 Bean 不再使用配置檔案的方式。有前面兩篇文章的基礎後實現 @Component 註解主要分成以下幾個步驟:
1. 讀取 XML 配置檔案,解析出需要掃描的包路徑
2. 對解析後的包路徑進行掃描然後讀取標有 @Component 註解的類,創建出對應的 BeanDefinition
3. 根據創建出來的 BeanDefinition 建立對應的 Bean 例項
下面我們一步步來實現這幾個步驟,最後去實現 @Component 註解:
#### 讀取 XML 配置檔案,解析出需要掃描的包路徑
假設有如下的 XML 配置檔案:
```xml
```
我們期望的結果是解析出來的掃描包路徑為: cn.mghio.service.version4、cn.mghio.dao.version4 。如果有仔細有了前面的文章後,這個其實就比較簡單了,只需要修改讀取 XML 配置檔案的類 XmlBeanDefinitionReader 中的 loadBeanDefinition(Resource resource) 方法,判斷當前的 namespace 是否為 context 即可,修改該方法如下:
```java
public void loadBeanDefinition(Resource resource) {
try (InputStream is = resource.getInputStream()) {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(is);
Element root = document.getRootElement