TL;DR
The @Autowired
注释使您无需在 XML 文件(或任何其他方式)中自行进行连接,只需为您找到需要注入的内容并为您执行此操作。
完整解释
The @Autowired
注释允许您跳过其他地方的注入内容配置,并为您完成它。假设您的包裹是com.mycompany.movies
您必须将此标记放入 XML(应用程序上下文文件)中:
<context:component-scan base-package="com.mycompany.movies" />
该标签将进行自动扫描。假设每个必须成为 bean 的类都使用正确的注释进行注释,例如@Component
(对于简单的bean)或@Controller
(对于 Servlet 控件)或@Repository
(for DAO
类)并且这些类位于包下的某个位置com.mycompany.movies
,Spring 将找到所有这些并为每个创建一个 bean。这是通过对类进行两次扫描来完成的 - 第一次它只是搜索需要成为 bean 的类并映射它需要执行的注入,而在第二次扫描时它会注入 bean。当然,您可以在更传统的 XML 文件中或使用@Configuration类(或三者的任意组合)。
The @Autowired
注解告诉 Spring 需要在哪里进行注入。如果你把它放在一个方法上setMovieFinder
它理解(通过前缀set
+ the @Autowired
注解)表明需要注入一个 bean。在第二次扫描中,Spring 搜索类型为MovieFinder
,如果找到这样的 bean,就会将其注入到此方法中。如果它找到两个这样的豆子,你会得到一个Exception
。为了避免Exception
,您可以使用@Qualifier
注释并告诉它以以下方式注入两个 bean 中的哪一个:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
或者,如果您更喜欢在 XML 中声明 bean,则它看起来像这样:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
In the @Autowired
声明,您还需要添加@Qualifier
告诉要注入两种颜色的豆中的哪一种:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
如果您不想使用两个注释(@Autowired
and @Qualifier
) 您可以使用@Resource
将这两者结合起来:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
The @Resource
(您可以在该答案的第一条评论中阅读有关它的一些额外数据)使您无需使用两个注释,而是只使用一个注释。
我再补充两条评论:
- 好的做法是使用
@Inject
代替@Autowired
因为它不是 Spring 特定的,并且是的一部分JSR-330标准.
- 另一个好的做法是将
@Inject
/ @Autowired
在构造函数而不是方法上。如果将其放在构造函数上,则可以验证注入的 bean 是否不为 null,并在尝试启动应用程序时快速失败并避免NullPointerException
当你需要实际使用 bean 时。
Update:为了完成图片,我创建了一个新问题有关@Configuration
class.