本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:了解Spring @Autowired用法
我正在阅读spring 3.0.x参考文档,以了解Spring Autowired注释:
我无法理解以下示例。我们是否需要在XML中做一些工作才能使其正常工作?
例子:
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
如何自动装配两个类以实现相同的接口并使用相同的类?
class Red implements Color
class Blue implements Color
class myMainClass{
@Autowired
private Color color;
draw(){
color.design();
}
}
将调用哪种设计方法?如何确定Red类的设计方法将被调用而不是Blue?
回答1:
@Autowired批注允许您跳过其他注入配置,而只是为您完成配置。 假设您的包是com.mycompany.movies,则必须将此标签放入XML(应用程序上下文文件)中:
<context:component-scan base-package="com.mycompany.movies" />
该标签将进行自动扫描。 假设每个必须成为bean的类都使用正确的注释(例如@Component(对于简单bean)或@Controller(对于servlet控件)或@Repository(对于DAO类))进行注释,并且这些类位于com.mycompany.movies包下的某个位置。Spring将找到所有这些,并为每一个创建一个bean。 这是通过对类的2次扫描完成的-第一次是它仅搜索需要成为bean的类并映射需要进行的注入,而在第二次扫描中,它将注入bean。当然,您可以在更传统的XML文件中或使用@Configuration类(或这三种的任意组合)来定义bean。
@Autowired注解告诉Spring需要在哪里进行注入。 如果将其放在setMovieFinder方法上,它将理解(通过前缀集+ @Autowired批注)一个bean需要被注入。 在第二次扫描中,Spring搜索类型为MovieFinder的bean,如果找到该bean,则将其注入此方法。 如果它找到两个这样的bean,您将获得Exception。 为了避免发生Exception,可以使用@Qualifier批注,并通过以下方式告诉它要注入的两个bean中的哪个:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
在@Autowired声明中,您还需要添加,@Qualifier以指示要注入的两种颜色的bean:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}