1. 程式人生 > >如何實現一個簡易版的 Spring - 如何實現 @Component 註解

如何實現一個簡易版的 Spring - 如何實現 @Component 註解

#### 前言 前面兩篇文章([如何實現一個簡易版的 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