上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注入适合于可选对象注入;而字段注入是应该被避免使用的,因为对象无法脱离容器而独立运行。