当前位置: 首页 > 面试题库 >

为什么构造函数注入比其他选项要好

锺离卓
2023-03-14
问题内容

在Pro Spring 3丛书的第4章-Spring中的IOC和DI简介-第59页中的“ Setter注入与构造方法注入”部分中,一段说

包括Spring,提供了一种机制来确保在使用Setter Injection时定义了所有依赖关系,但是通过使用Constructor Injection,你可以以与容器无关的方式声明对依赖关系的要求。”

你能举例说明一下吗


问题答案:

将必需的依赖项作为构造函数参数的类只有在提供了该参数的情况下才能实例化(你应具有guard子句以确保该参数不为null。)因此,无论你是否在构造函数中强制执行依赖项要求使用Spring,使其与容器无关。

如果使用setter注入,则可能会调用setter,也可能不会调用setter,因此可能永远不会为实例提供依赖项。强制调用setter的唯一方法是使用@Required@Autowired ,这是特定于Spring的,因此与容器无关。

因此,要使你的代码独立于Spring,请使用构造函数参数进行注入。

更新:Spring 4.3将在单构造器场景中执行隐式注入,从而可能完全不需要@Autowired注释,从而使你的代码更独立于Spring 。



 类似资料:
  • 在一本支持Spring3的书中,第4章——Spring中的IOC和DI简介——第59页,在“Setter注入与构造函数注入”一节中,有一段说 包括Spring,提供了一种机制,用于确保在使用Setter注入时定义所有依赖项,但通过使用构造函数注入,您可以以与容器无关的方式断言对依赖项的需求。” 你能举例解释一下吗

  • 一个更一般的问题。如果在常规Spring托管类中使用构造函数注入,则这些类将自动连接,而不需要@autowired注释,即: 在@SpringBootTest类中遵循相同的构造函数注入原则,您需要将@Autowired注释设置为构造函数参数,否则它将无法注入该类,即: 为什么会出现这种差异?

  • 问题内容: 在Java的构造函数中,如果要调用另一个构造函数(或超级构造函数),则它必须是该构造函数的第一行。我认为这是因为不允许您在其他构造函数运行之前修改任何实例变量。但是,为什么不能在构造函数委派之前使用语句,以便计算另一个函数的复杂值?我想不出任何正当的理由,在一些实际案例中,我编写了一些丑陋的代码来解决此限制。 所以我只是想知道: 有此限制的充分理由吗? 有没有计划在将来的Java版本中

  • 问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 我总是得到与此类似的结果。为什么第一个电话比其他电话要花10倍的时间?

  • 问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数