原文鏈接: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!
結束
通過打印結果可以發現,
- Spring幫我們將接口的所有實現類都注入進了
TestService
的List<HelloService>
,並且是按照我們通過@Order
指定的順序,如果不指定Service 名稱,會以默認名稱的首字母排序。 - Spring 也將接口的所有實現類都注入進了
TestService
的Map<String, HelloService>
,Key爲 Bean 的名稱,value 爲對應的實現類。因爲Map具體類型爲LinkedHashMap
,沒有按照我們指定的順序執行。