我正在阅读spring 3.0.x参考文档以了解spring Autowired注释:
我不能理解下面的例子。我们需要在XML中做些什么才能让它工作吗
例1
公共类SimpleMovieLister{
私人影迷;
@自动连线
公共无效设置MovieFinder(MovieFinder MovieFinder){
this.movieFinder=movieFinder;
}
// ...
}
例2
公共类电影推荐人{
私人电影目录;
私人客户参考DAO客户参考DAO;
@自动连线
公共无效准备(MovieCatalog MovieCatalog,
客户参考DAO(客户参考DAO){
this.movieCatalog=movieCatalog;
this.customerPreferenceDao=customerPreferenceDao;
}
// ...
}
这两个类如何实现相同的接口并使用相同的类进行自动连接
例如:
类红色实现颜色
类蓝色实现颜色
类MyMain类{
@自动连线
私人色彩;
画(){
颜色设计();
}
}
将调用哪种设计方法?如何确保调用Red类的设计方法而不是Blue
TL;DR
@Autowired注释省去了您自己在XML文件(或任何其他方式)中进行连接的需要,只需为您找到需要在何处注入的内容,并为您这样做
完整解释
@Autowired注释允许您跳过要注入的内容的其他配置,只为您执行。假设您的包是com.mycompany.movies,则必须将此标记放入XML(应用程序上下文文件)中:
<;上下文:组件扫描基本包=";com.mycompany.movies“/&燃气轮机;
此标签将进行自动扫描。假设每个必须成为bean的类都使用正确的注释进行注释,如@Component(对于简单bean)或@Controller(对于servlet控件)或@Repository(对于DAO类),并且这些类位于包com.mycompany.movies下的某个地方,Spring将找到所有这些,并为每一个创建一个bean。这是在2次类扫描中完成的——第一次它只搜索需要成为bean的类并映射它需要进行的注入,第二次扫描它注入bean。当然,您可以在更传统的XML文件中或使用@Configuration类(或三者的任意组合)
@Autowired注释告诉Spring需要在哪里进行注射。如果将它放在方法setMovieFinder上,它会理解(通过前缀set+@Autowired注释)需要注入bean。在第二次扫描中,Spring搜索类型为MovieFinder的bean,如果找到这样的bean,它会将其注入这个方法。如果它找到两个这样的bean,您将得到一个异常。为了避免异常,您可以使用@Qualifier注释,并告诉它以以下方式注入两个bean中的哪一个:
@限定符(“红豆”)
类红色实现颜色{
//这里是班级代码
}
@限定符(“blueBean”)
类蓝色实现颜色{
//这里是班级代码
}
或者,如果您更喜欢在XML中声明bean,它将如下所示:
<;bean id=";红豆“;类别=“类”;com.mycompany.movies.Red“/&燃气轮机;
<;bean id=";“蓝豆”;类别=“类”;com.mycompany.movies.Blue“/&燃气轮机;
在@Autowired声明中,您还需要添加@Qualifier来告诉要注入的两个色豆中的哪一个:
@自动连线
@限定符(“红豆”)
公共空间设置颜色(颜色){
这个颜色=颜色;
}
如果您不想使用两个批注(“代码>@Autowired和@Qualifier),可以使用@Resource将这两个批注组合起来:
@Resource(name=";redBean";)
公共空间设置颜色(颜色){
这个颜色=颜色;
}
@Resource(您可以在这个答案的第一个注释中阅读一些关于它的额外数据)省去了您使用两个注释,而只使用一个注释
我只想再添加两条评论:
- 好的做法是使用
@Inject而不是@Autowired,因为它不是特定于Spring的,并且是JSR-330标准的一部分 - 另一个好的做法是将
@Inject/@Autowired放在构造函数而不是方法上。如果将其放在构造函数上,则可以验证注入的bean是否为null,并在尝试启动应用程序时快速失败,并在需要实际使用bean时避免出现NullPointerException
更新:为了完成图片,我创建了一个关于@配置类的新问题