5.1 了解Spring @Autowired用法| Java Debug 笔记

376 阅读2分钟

本文正在参加「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;
}