Spring學習 - 自動裝配同一個接口的多個實現類

原文鏈接:http://followtry.cn/2019-12-03/spring-mutli-autowire-beans.html

介紹

在平時使用 Spring 的 DI 機制時,幾乎都是在某個類中引用接口的單個實現。但是Spring 如何將多個實現類同時注入進List<Interface> 中呢。好吧,不說廢話了,直接上代碼吧。

原來的引用方式

public interface HelloService {
    void sayHello();
}

@Service
public class TestServiceImpl implements TestService {
    @Autowired
    private HelloService  helloService;
}

Spring 高級功能

還是以HelloService接口爲例,實現多個實例。

HelloService接口

public interface HelloService {

    void sayHello();
}

HelloService實現類

分別實例化的三個與世界打招呼的實現類。

@Service("Cat")
@Order(10)
public class CatHelloService implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("I'm a Cat,Hello world!");
    }
}

@Service
@Order(3)
public class DogHelloService implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("I'm a Dog,Hello world!");
    }
}

@Service
@Order(1)
public class PigHelloService implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("I'm a pig,Hello world!");
    }
}

通過@Service("Cat")指定實現類的 bean 名稱,通過@Order(3)來指定實現類的順序。

引用HelloService的測試類

public interface TestService {

    void sayHello();
}

@Service
public class TestServiceImpl implements TestService {

    @Autowired
    private List<HelloService> multiServiceList;

    @Autowired
    private Map<String, HelloService> multiServiceMap;

    @Override
    public void sayHello() {
        System.out.println("--------------list--------------");
        for (HelloService multiService : multiServiceList) {
            multiService.sayHello();
        }

        System.out.println("--------------map--------------");
        for (Map.Entry<String, HelloService> entry : multiServiceMap.entrySet()) {
            System.out.println("key=" + entry.getKey());
            entry.getValue().sayHello();
        }
    }
}

TestServiceImpl該類中,通過 List和 Map 兩種方式引入了HelloService的實現類注入,期望是可以按照我們的預期將HelloService的所有類都注入。

測試主類

初始化 Spring 並調用TestService的方法

public class TestMain {
    public static void main(String[] args) {
        GenericApplicationContext applicationContext = new AnnotationConfigApplicationContext("cn.followtry.boot");
        TestService testService = applicationContext.getBean(TestService.class);
        testService.sayHello();
        System.out.println("結束");
    }
}

執行結果

--------------list--------------
I'm a pig,Hello world!
I'm a Dog,Hello world!
I'm a Cat,Hello world!
--------------map--------------
key=Cat
I'm a Cat,Hello world!
key=dogHelloService
I'm a Dog,Hello world!
key=pigHelloService
I'm a pig,Hello world!
結束

通過打印結果可以發現,

  1. Spring幫我們將接口的所有實現類都注入進了TestServiceList<HelloService>,並且是按照我們通過@Order指定的順序,如果不指定Service 名稱,會以默認名稱的首字母排序。
  2. Spring 也將接口的所有實現類都注入進了TestServiceMap<String, HelloService>,Key爲 Bean 的名稱,value 爲對應的實現類。因爲Map具體類型爲LinkedHashMap,沒有按照我們指定的順序執行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章