【问题标题】:Spring IoC: Reasons to have null checks with constructor autowiringSpring IoC:使用构造函数自动装配进行空检查的原因
【发布时间】:2018-05-29 15:29:14
【问题描述】:

在 spring autowring 中使用 null 检查的原因是什么?

例如,我经常看到这样的代码:

@Component
public class MyComponent {
    private final MyService myService;

    @Autowired
    public MyComponent(MyService myService) {
        Assert.notNull(myService, "myService must not be null");
        this.myService = myService;
    }
}

Assert.notNull() 打电话到这里有什么意义?

如果我忘记将 MyService 声明为 Bean Spring 将失败:

NoSuchBeanDefinitionException:没有可用的“com.company.MyService”类型的合格 bean:预计至少有 1 个符合自动装配候选资格的 bean。

当然,在某些特殊情况下,可以自动装配空 bean。但这些情况在真正设计良好的代码中有多重要?

【问题讨论】:

    标签: java spring dependency-injection spring-ioc


    【解决方案1】:

    在这里调用 Assert.notNull() 有什么意义?

    在这种情况下,您通过构造函数自动装配,并且断言的目的是确保服务已正确注入除null 之外的任何内容它在未来造成任何麻烦之前。虽然NoSuchBeanDefinitionException 在没有定义正确类型的bean 时被抛出,null 仍然可能被注入并且自动装配机制无法处理它,因为它不是它的目的。

    【讨论】:

    • 谢谢。问题是,即使您想人为地模拟注入 null 的情况,它也不是那么简单。我不得不谷歌如何做到这一点。从这个角度来看,写断言是没有用的。
    【解决方案2】:

    当任何开发人员以纯 Java 方式创建对象时,它很有用,例如 "new Bean(null)" 或者也可以使用 "null" 标记将 null 作为基于 XML 的注入中的值传递。在这两种情况下,这个断言都会在创建 bean 时大喊大叫。

    【讨论】:

      【解决方案3】:

      代码毫无意义。如果在上下文中找不到候选 bean,Spring 将抛出 NoSuchBeanDefinitionException。这是框架的核心行为,我认为没有任何理由再猜测它。

      您可以指定自动装配的 bean 是可选的:

      @Autowired(required = false)
      

      但是空检查就更没有意义了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多