1. 程式人生 > >如何實現一個簡易版的 Spring - 如何實現 Constructor 注入

如何實現一個簡易版的 Spring - 如何實現 Constructor 注入

#### 前言 本文是「如何實現一個簡易版的 Spring」系列的第二篇,在 [第一篇](https://www.mghio.cn/post/24cb2421.html) 介紹瞭如何實現一個基於 XML 的簡單 Setter 注入,這篇來看看要如何去實現一個簡單的 Constructor 注入功能,實現步驟和 Setter 注入是一樣的“套路”,先設計一個數據結構去解析表達 XML 配置檔案裡的資訊,然後再使用這些解析好的資料結構做一些事情,比如這裡的 Constructor 注入。話不多說,下面我們直接進入正題。 #### 資料結構設計 使用 Constructor 注入方式的 XML 的一種配置如下所示: ```xml ``` 以上 OrderService 類如下: ```Java /** * @author mghio * @since 2021-01-16 */ public class OrderService { private StockDao stockDao; private TradeDao tradeDao; private String owner; public OrderService(StockDao stockDao, TradeDao tradeDao, String owner) { this.stockDao = stockDao; this.tradeDao = tradeDao; this.owner = owner; } } ``` 從 XML 的配置結構上看和 Setter 注入類似,都是 Key-Value 類的格式,可以將每個 constructor-arg 節點抽象為 ValueHolder,包含實際解析後的值型別 value、型別 type 以及引數名稱 name,如下所示: ```Java /** * @author mghio * @since 2021-01-16 */ public class ValueHolder { private Object value; private String type; private String name; // omit setter and getter } ``` 同樣一個 Bean 可以包含多個 ValueHolder,為了封裝實現以及方便提供一些判斷方法(比如是否配置有構造器注入等),將進一步封裝為 ConstructorArgument,並提供一些 CRUD 介面,而 ValueHolder 作為內部類,如下所示: ```Java /** * @author mghio * @since 2021-01-16 */ public class ConstructorArgument { private fi