【发布时间】:2018-03-05 17:53:24
【问题描述】:
根据 Spring bean 的定义,POJO 应该有一个无 -arg 构造函数。 考虑到基于构造函数的 DI 的好处,通过查看构造函数本身,我们可以知道它的依赖关系是什么,没有无参数构造函数会消除这个优势。
【问题讨论】:
标签: java spring spring-boot
根据 Spring bean 的定义,POJO 应该有一个无 -arg 构造函数。 考虑到基于构造函数的 DI 的好处,通过查看构造函数本身,我们可以知道它的依赖关系是什么,没有无参数构造函数会消除这个优势。
【问题讨论】:
标签: java spring spring-boot
基于构造函数的依赖注入更具预测性,并创建不可变的、完全初始化的对象。基于 Setter 的 DI 用于被视为可选的依赖项,但也允许在稍后阶段进一步重新配置对象。两者都是有效的,都有权衡取舍,因此都被广泛使用。
来自Spring documentation(参见基于构造函数还是基于setter的DI?框):
Spring 团队通常提倡构造函数注入,因为它可以将应用程序组件实现为不可变对象,并确保所需的依赖项不为空。此外,构造函数注入的组件总是以完全初始化的状态返回给客户端(调用)代码。作为旁注,大量的构造函数参数是一种不好的代码气味,这意味着该类可能有太多的职责,应该重构以更好地解决关注点的适当分离。
Setter 注入 应该主要只用于可选依赖项,可以在类中分配合理的默认值。否则,必须在任何地方执行非空检查代码使用依赖项。 setter 注入的一个好处是 setter 方法使该类的对象可以在以后重新配置或重新注入。
(重点是我的)
【讨论】: