@Primary 和 @Qualifier的區別

  當一個接口有多個不同實現時,注入Spring的時候會產生org.springframework.beans.factory.NoUniqueBeanDefinitionException異常信息。
  解決方式有2種,使用@Primary 和 @Qualifier註解。

註解 區別
@Primary 優先注入該註解的標註的bean
@Qualifier 確定注入該註解標定的bean

1、@Qualifier

  該註解的意思是直接注入該註解標定的bean,而非選擇。如:

public interface ITeacher {
    String getName();
}
@Component
public class MathTeacher implements ITeacher {
    public String getName() {
        return "Math";
    }
}

@Component
public class EnglishTeacher implements ITeacher {
    public String getName() {
        return "English";
    }
}

  如果這個時候使用@Autowired就會報錯,需要指定注入具體對象:

public class ClassRoom {
   @Autowired
   @Qualifier("englishTeacher")
   public ITeacher teacher;
}

2、@Primary

  @Qualifier是在使用注入的時候,使用方明確指出使用哪個;@Primary更像是提供方告訴你優先使用哪個。舉個例子,你實現排序接口的很多的實例,如冒泡排序,快排,選擇排序等等。在使用者選擇不明確的情況下,你希望他優先(默認)選擇冒泡排序。這樣你就在冒泡排序實現類上使用@Primary予以標識。

public interface ISort {
    String getName();
}
@Component
@Primary
public class MaopaoSort implements ISort {
    public String getName() {
        return "冒泡排序";
    }
}

@Component
public class XuanzeSort implements ISort {
    public String getName() {
        return "選擇排序";
    }
}
public class MySort {
   @Autowired
   public ISort sort;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章