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