如何實現一個簡易版的 Spring - 如何實現 Constructor 注入
阿新 • • 發佈:2021-01-17
#### 前言
本文是「如何實現一個簡易版的 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