官术网_书友最值得收藏!

2.1.2 構(gòu)造器注入

構(gòu)造器注入的形式也很簡單,就是通過類的構(gòu)造函數(shù)來完成對象的注入,示例代碼如代碼清單2-5所示。

代碼清單2-5 構(gòu)造器注入示例代碼

public class ClientService {
    private HealthRecordService healthRecordService;

    @Autowired
    public ClientService(HealthRecordService healthRecordService) {
        this.healthRecordService = healthRecordService;
    }

    public void recordUserHealthData() {
        healthRecordService.recordUserHealthData();
    }
}

可以看到構(gòu)造器注入能解決對象外部可見性的問題,因為HealthRecordService是通過ClientService構(gòu)造函數(shù)進行注入的,所以勢必可以脫離ClientService而獨立存在。

我們進一步引用Spring官方文檔來解釋構(gòu)造器注入的特性:

The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.

這段話的核心意思在于:構(gòu)造器注入能夠保證注入的組件不可變,并且確保需要的依賴不為空。這里的組件不可變就意味著我們可以使用final關(guān)鍵詞來修飾所依賴的對象,而依賴不為空是指所傳入的依賴對象肯定是一個實例對象,從而避免出現(xiàn)空指針異常。

同時,基于構(gòu)造器注入,我們也來討論前面介紹的ClassA和ClassB之間的循環(huán)依賴關(guān)系,實現(xiàn)方式如代碼清單2-6所示。

代碼清單2-6 基于構(gòu)造器注入的循環(huán)依賴示例代碼

public class ClassA {
    private ClassB classB;
    @Autowired
    public ClassA(ClassB classB) {
        this.classB = classB;
    }
}

public class ClassB {
    private ClassA classA;
    @Autowired
    public ClassB(ClassA classA) {
        this.classA = classA;
    }
}

一旦采用構(gòu)造器注入,在Spring項目啟動的時候,就會拋出一個循環(huán)依賴異常,從而提醒你避免使用循環(huán)依賴。

通過上述分析,我們可以看到字段注入的三大問題都可以通過使用構(gòu)造器注入的方式來解決。但是,構(gòu)造器注入的顯著問題就是當構(gòu)造函數(shù)中存在較多依賴對象時,大量的構(gòu)造器參數(shù)會讓代碼冗長。這時候就可以引入Setter方法注入。

主站蜘蛛池模板: 分宜县| 绩溪县| 读书| 磐石市| 英德市| 静宁县| 扶余县| 浦城县| 鸡东县| 当涂县| 吉水县| 将乐县| 包头市| 正镶白旗| 黑龙江省| 固阳县| 武定县| 和林格尔县| 汤阴县| 婺源县| 板桥市| 拉孜县| 渭南市| 江油市| 和硕县| 资溪县| 海晏县| 扬中市| 华池县| 安图县| 德州市| 陇川县| 上饶市| 罗定市| 卢龙县| 靖宇县| 南丰县| 高州市| 景宁| 仁化县| 皋兰县|