Spring IoC:使用构造函数自动装配进行空检查的原因

时间:2018-05-29 15:29:14

标签: java spring dependency-injection spring-ioc

在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可用:预计至少有一个bean可以作为autowire候选者。

当然,有一些极端情况下,在某些特定条件下,可以自动装配null bean。但这些案例在真正精心设计的代码中有多重要?

3 个答案:

答案 0 :(得分:1)

  

Assert.notNull()在这里调用的重点是什么?

在这种情况下,您通过构造函数进行自动装配,并且断言的目的是确保服务在{/ 1}之前正确地注入了 之前它将导致任何麻烦。虽然在没有定义正确类型的bean时抛出null,但仍然可能注入NoSuchBeanDefinitionException并且自动装配机制不会处理它,因为它不是它的用途。

答案 1 :(得分:1)

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

您可以指定aoutwired bean是可选的:

@Autowired(required = false)

然后空检查更没意义。

答案 2 :(得分:1)

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