Spring Boot进阶:原理、实战与面试题分析
上QQ阅读APP看书,第一时间看更新

2.1.3 Setter方法注入

先来看一下Setter方法注入的实现代码,如代码清单2-7所示。

代码清单2-7 Setter方法注入示例代码

public class ClientService {
    private HealthRecordService healthRecordService;

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

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

Setter方法注入和构造器注入看上去有点类似,但它比构造函数更具可读性,因为我们可以把多个依赖对象分别通过Setter方法逐一进行注入。而且,Setter方法注入对于非强制依赖项注入很有用,我们可以有选择地注入一部分依赖对象。换句话说,该方法可以实现按需注入,帮助我们只在需要时注入依赖关系。

另外,Setter方法可以很好地解决应用程序中的循环依赖问题,如代码清单2-8所示的代码是可以正确执行的。

代码清单2-8 基于Setter方法注入的循环依赖示例代码

public class ClassA {
    private ClassB classB;

    @Autowired
    public void setClassB(ClassB classB) {
        this.classB = classB;
    }
}

public class ClassB {
    private ClassA classA;

    @Autowired
    public void setClassA(ClassA classA) {
        this.classA = classA;
    }
}

请注意,上述代码能够正确执行的前提是ClassA和ClassB的作用域都是Singleton。关于Spring中的对象作用域,我们在本章后续会具体讨论。

最后,通过Setter注入可以对依赖对象进行多次重复注入,这在构造器注入中是无法实现的。

作为总结,我们用一句话来概括Spring所提供的三种依赖注入类型:构造器注入适合于强制对象注入;Setter注入适合于可选对象注入;而字段注入是应该被避免使用的,因为对象无法脱离容器而独立运行。