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

Spring在启动web应用程序时是否需要所有bean?,spring,spring-mvc,spring-boot,spring-batch,Spring,Spring Mvc,Spring Boot,Spring Batch,我有一个SpringWeb应用程序。我在下面展示的bean不是web应用程序所必需的。所以我提到了不在web应用程序上加载的条件。 此外,我没有扫描在ApplicationConfig.java中定义此bean的包。但我还是有例外 Could not autowire field: private com.Foo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qu

我有一个SpringWeb应用程序。我在下面展示的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();
}

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

  • @带有字段注入的自动连线(必需=假),以表明它是可选的

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

    @Autowired(required=false)
    public void setFoo(Foo foo) {
         this.foo = foo;
    }
    
总之,基于构造函数的依赖项注入(构造函数上的@Autowired)是用于强制依赖项的。@Autowired中所需的标志将被忽略,bean必须存在


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

似乎是
Foo
注入到另一个bean中。但根据条件,Spring没有加载Foo,因此无法找到它进行注射。是的,Foo是在不同的bean中自动连接的。但是这个bean也没有被扫描..是的,我在不同的bean中自动连接了Foo..但是我正在自动连接Foo的类在我的组件扫描中没有被扫描..但是它仍然需要这个bean。Spring是否需要所有自动连接的bean而不考虑扫描?否,如果未扫描其他组件,则Spring将不要求Foo出现。如果您尝试在另一个类中删除@Autowired注释,您仍然会遇到问题吗?您是否正在使用SpringBoot,它会根据配置方式自动添加要扫描的包?可能是其他东西正在添加要扫描的包,还是您正在以@Bean的形式返回该类?请注意,子包也会针对指定用于扫描的包进行扫描。请详细说明我如何给出@Autowired(required=false)。如果我有一个类,其中“class Boo{Autowired(required=false)Foo-Foo;”如果bean不可用,Spring将不会自动连接,也不会出现错误?我的理解正确吗?如果bean可用,它将自动连接?这是正确的,我已经更新了答案,使其更清晰。