Spring在启动Web应用程序时是否期望所有bean?

时间:2016-03-10 11:03:53

标签: spring spring-mvc spring-boot spring-batch

我有一个Spring Web应用程序。我在下面显示的bean不是Web应用程序所必需的。所以我提到了不在Web应用程序上加载的条件。 此外,我不扫描在我的ApplicationConfig.java中定义此bean的包。但我仍然得到例外

 Could not autowire field: private com.Foo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.Foo] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

@Bean
@ConditionalOnNotWebApplication
@ConditionalOnProperty(name=LNACALL, havingValue = "true")
public Foo createFoo() {
     return new Foo();
}

1 个答案:

答案 0 :(得分:2)

看起来你的应用程序中的其他地方可能有一个@Autowired注释,它需要这种类型的bean。您可以尝试执行以下操作之一:

  • 带有字段注入的@Autowired(required = false)表示它是可选的

    @Autowired(required=false) private Foo foo;
    
  • 使用setter注入,而不是将@Autowired放在setter上:

    @Autowired(required=false)
    public void setFoo(Foo foo) {
         this.foo = foo;
    }
    

总而言之,基于构造函数的依赖注入(@Autowired在构造函数上)是强制依赖的。

如果@Autowired required标志设置为false,则基于Setter和字段注入可用于可选依赖项。如果required标志设置为false,那么Spring将注入bean(如果存在)。如果它不存在,那么该值将为null。