Spring中还有一招集合注入的写法

Map注入

首先来看Map类型的注入,直接在Service中注入一个Map,key为字符串类型,value为上面定义的接口类型。

1
2
3
4
5
6
7
8
9
@Service
@AllArgsConstructor
public class UserMapService {
final Map<String, UserDao> userDaoMap;

public Map<String,UserDao> getDaos(){
return userDaoMap;
}
}

Map中的value是实现了接口的实例对象,key则是beanName,可以通过@Component的value属性进行自定义。

List注入

在Service中,这次注入泛型为接口UserDao类型的List。

1
2
3
4
5
6
7
8
9
@Service
@AllArgsConstructor
public class UserListService {
private final List<UserDao> userDaoLists;

public List<UserDao> getDaos(){
return userDaoLists;
}
}

List是一个有序的数据结构,那么如果想要修改List中bean的排序,该如何做呢?
很简单,修改注入到spring容器中的两个bean,为它们添加@Order注解并指定加载顺序,数字越小越优先加载。

1
2
3
4
5
6
@Component
@Order(1)
public class UserDaoA implements UserDao {……}
@Component
@Order(-1)
public class UserDaoB implements UserDao {……}

Set注入

1
2
3
4
5
6
7
8
9
@Service
@AllArgsConstructor
public class UserSetService {
private final Set<UserDao> userDaoSet;

public Set<UserDao> getDaos(){
return userDaoSet;
}
}

数组注入

最后,我们再来看一下数组注入的方式:

1
2
3
4
5
6
7
8
9
@Service
@AllArgsConstructor
public class UserArrayService {
private final UserDao[] userDaoArray;

public UserDao[] getDaos(){
return userDaoArray;
}
}

应用

例如,用Map注入实现策略模式,来替换代码中繁杂的if/else判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public String choice(String name){
if (name.equals("auth")){
return "1";
}else if (name.equals("official")){
return "2";
}
return null;
}
使用策略模式进行改造,首先修改beanName:

@Component(value = "auth")
public class UserDaoA implements UserDao {
@Override
public String getName() {
return "1";
}
}
@Component(value = "official")
public class UserDaoB implements UserDao {
@Override
public String getName() {
return "2";
}
}

@Service
@AllArgsConstructor
public class TestService {
final Map<String, UserDao> userDaoMap;

public String choice2(String name){
return userDaoMap.get(name).getName();
};
}

@Service
@AllArgsConstructor
public class TestService {
final List<UserDao> userDaoLists;

public String choiceFirst(){
return userDaoLists.get(0).getName();
};
}