【发布时间】:2021-01-27 19:55:04
【问题描述】:
在一个真实的项目中,我发现@Component在下面的代码中可能会被省略:
// no @Component !!!!!
public class MovieRecommender {
private final CustomerPreference customerPreference;
@Autowired
public MovieRecommender(CustomerPreference customerPreference) {
this.customerPreference = customerPreference;
}
// ...
}
@Component
public class CustomerPreference {...}
(示例取自 Spring 官方文档 https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/htmlsingle/#beans-autowired-annotation ,文档根本没有显示 @Component,这可能意味着它不需要它,或者它只是没有显示。)
我工作的项目没有使用任何 XML bean 声明,但它使用了 Spring 以外的框架,因此有可能将类声明为 bean。或者它可能是我们使用的 Spring 版本的一个特性,如果该特性没有记录在案,它可能会在以后被删除。
问题:
使用@Autowired 的类必须用@Component 注释(好吧,是一个bean)?有相关的官方文档吗?
UPD 伙计们,项目中没有@Configuration 和XML 配置,我知道这样的声明会从一个类中生成一个bean,但问题不在于它们。我什至在上面的问题中写了 "(好吧,成为一个 bean)" 来涵盖这一点。 @Autowired 在不是 bean 的类中工作吗?或者它可能声明了将其用作 bean 的类?
【问题讨论】:
-
好吧,如果你没有得到空指针异常,它似乎正在工作:)
-
创建 Spring bean 有不同的方法。一种是将
@Component与类路径扫描一起使用,其他方法是使用XML 配置或Java 配置,在@Configuration类中使用@Bean方法。所以答案是:不,@Autowired并不一定意味着你也必须使用@Component。 -
是的,它可以通过
@Configuration类中的@Bean注释来完成,但是在构造函数上使用@Autowired似乎没有多大意义,因为在 Bean 定义中你必须逐字指定什么类你愿意在那里注入,所以不会有自动装配。 @OP:对我来说,在将此组件从基于注释的配置重构为基于 Java 的配置之后,似乎有人忘记从您的源代码中删除此注释。您是否尝试删除此@Autowire?顺便说一句。现代 IDE 应该有可能显示特定 bean 的注册位置。试试看吧 -
可以用
applicationContext.xml或@Configuration+@Bean注册。 -
@Autowired在上面的例子中构造没有意义... 在一个真实的项目中,我发现@Component 在下面的代码中可能会被省略 嗯,我不这么认为...
标签: java spring spring-boot