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(); }; }
|