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

Does Spring expects all the beans when starting the web application?

我有一个 Spring 网络应用程序。 Web 应用程序不需要我在下面显示的 bean。所以我提到了不加载 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();
}

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

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

    @Autowired(required=false) private Foo foo;
    
  • 通过将@Autowired 放在setter:

    上而不是使用setter 注入
    @Autowired(required=false)
    public void setFoo(Foo foo) {
         this.foo = foo;
    }
    

综上所述,基于构造函数的依赖注入(构造函数上的@Autowired)是针对强制依赖的。 @Autowired 中的 required 标志将被忽略,bean 必须存在。

如果 @Autowired 必需标志设置为 false,则基于

Setter 和字段注入可用于可选依赖项。如果 required 标志设置为 false,则 Spring 将注入存在的 bean。如果不存在,则该值为空。