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

Posted

技术标签:

【中文标题】Spring 在启动 Web 应用程序时是不是需要所有 bean?【英文标题】:Does Spring expects all the beans when starting the web application?Spring 在启动 Web 应用程序时是否需要所有 bean? 【发布时间】:2016-06-25 04:29:55 【问题描述】:

我有一个 Spring Web 应用程序。 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();

【问题讨论】:

似乎是Foo 注入到另一个bean。但是根据情况,Spring没有加载Foo,因此找不到注入。 是的 Foo 在不同的 bean 中自动装配。但是那个 bean 也没有被扫描.. 【参考方案1】:

看起来您可能在应用程序的其他地方有一个 @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 required 标志设置为 false,则基于 Setter 和字段注入可用于可选依赖项。如果 required 标志设置为 false,则 Spring 将注入 bean(如果存在)。如果不存在,则该值将为空。

【讨论】:

是的,我在不同的 bean 中自动装配了 Foo..但是在我的组件扫描中没有扫描我自动装配 Foo 的类..但它仍然期待 bean。 Spring 是否期望所有 Autowired bean 与扫描无关? 不,如果您的其他组件没有被扫描,那么 Spring 将不需要 Foo 存在。如果您尝试删除其他类中的 @Autowired 注释,您是否仍然遇到问题?您是否正在使用 Spring Boot,这取决于它的配置方式会自动添加要扫描的包?是否有其他东西正在添加要扫描的包,或者您正在将该类作为@Bean 返回?请注意,对于指定扫描的包,也会扫描子包。 您能否详细说明我如何提供@Autowired(required=false)。如果我有一堂课,其中“class Boo Autowired(required=false) Foo foo;”如果 bean 不可用,Spring 不会自动装配 bean 并且不会抛出错误?我的理解对吗?如果 bean 可用,它会自动装配? 没错,我已经更新了答案,让它更清楚一点。

以上是关于Spring 在启动 Web 应用程序时是不是需要所有 bean?的主要内容,如果未能解决你的问题,请参考以下文章

web服务启动spring自动执行ApplicationListener的用法

Spring Web项目spring配置文件随服务器启动时自动加载

Spring Boot Starter-Web 尝试在启动时连接到 Mongo

我需要我的 Spring Boot Web 应用程序在 JUnit 中重新启动

Spring-IOC 在非 web 环境下优雅关闭容器

Java Spring Web Application 在调试模式下启动缓慢