Java Spring IoC:使用构造函数自动连接进行空检查的原因
在spring autowring中使用空检查的原因是什么 例如,我经常看到这样的代码:Java Spring IoC:使用构造函数自动连接进行空检查的原因,java,spring,dependency-injection,spring-ioc,Java,Spring,Dependency Injection,Spring Ioc,在spring autowring中使用空检查的原因是什么 例如,我经常看到这样的代码: @Component public class MyComponent { private final MyService myService; @Autowired public MyComponent(MyService myService) { Assert.notNull(myService, "myService must not be 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个符合autowire候选条件的bean
当然,在某些情况下,在某些特定条件下,可以自动连接null bean。但是这些情况在真正设计良好的代码中有多重要呢
这里的Assert.notNull()调用有什么意义
在这种情况下,您可以由构造函数自动连接,断言的目的是确保服务已被正确地注入,而不是
null
,以免将来出现任何问题。尽管在没有定义正确类型的bean时会抛出NoSuchBeanDefinitionException
,但是仍然可能会注入null
,并且自动连线机制不会处理它,因为这不是它的目的。代码毫无意义。如果在上下文中找不到候选bean,Spring将抛出一个NoSuchBeanDefinitionException。这是框架的核心行为,我不认为有任何理由对此进行二次猜测
您可以指定自动连线bean是可选的:
@Autowired(required = false)
但是空检查的意义就更小了。当任何开发人员以普通Java方式创建对象时,如
“new Bean(null)”
或使用“null”
标记将null
作为基于XML的注入中的值传递时,空检查非常有用。在这两种情况下,这个断言将在bean创建本身时发出 多谢各位。问题是,即使您想要人为地模拟一种注入null的情况,也不是那么简单。我不得不用谷歌搜索如何做到这一点。从这个角度来看,编写断言是没有用的。