【问题标题】:No arg Constructor in Spring negates Constructor based DI benefitsSpring 中没有 arg 构造函数否定了基于构造函数的 DI 好处
【发布时间】:2018-03-05 17:53:24
【问题描述】:

根据 Spring bean 的定义,POJO 应该有一个无 -arg 构造函数。 考虑到基于构造函数的 DI 的好处,通过查看构造函数本身,我们可以知道它的依赖关系是什么,没有无参数构造函数会消除这个优势。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    课程用马

    基于构造函数的依赖注入更具预测性,并创建不可变的、完全初始化的对象。基于 Setter 的 DI 用于被视为可选的依赖项,但也允许在稍后阶段进一步重新配置对象。两者都是有效的,都有权衡取舍,因此都被广泛使用。

    来自Spring documentation(参见基于构造函数还是基于setter的DI?框):

    Spring 团队通常提倡构造函数注入,因为它可以将应用程序组件实现为不可变对象,并确保所需的依赖项不为空。此外,构造函数注入的组件总是以完全初始化的状态返回给客户端(调用)代码。作为旁注,大量的构造函数参数是一种不好的代码气味,这意味着该类可能有太多的职责,应该重构以更好地解决关注点的适当分离。

    Setter 注入 应该主要只用于可选依赖项,可以在类中分配合理的默认值。否则,必须在任何地方执行非空检查代码使用依赖项。 setter 注入的一个好处是 setter 方法使该类的对象可以在以后重新配置或重新注入

    (重点是我的)

    【讨论】:

    • 看来你没明白我的意思。根据我的知识,创建基于构造函数的注入的全部意义在于,通过查看类,我们应该了解所有必需的依赖项。但是,如果我们创建无参数常量,仍然可以创建歧义 bcoz 类没有它的所有依赖项,如果我们不创建默认常量,spring 会抛出 BeanInstation 异常(我猜它使用反射)。所以基于构造函数的 DI 可能无法达到它应该是我的问题的目的?
    • @darshankamat POJO 应该有一些构造函数定义,要么是无参数构造函数,要么是另一个基于参数的构造函数,可以由 Spring 自动装配。见这里:baeldung.com/constructor-injection-in-spring
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多