1. @LoadBalanced
    2. @Autowired(required = false)
    3. private List<RestTemplate> restTemplates = Collections.emptyList();

    这个restTemplates能够将所有标注了@LoadBalanced的RestTemplate自动注入进来呢?这就要说说@Autowired注解和@Qualifier这两个注解了。
    大家日常使用很多都是用@Autowired来注入一个bean,其实@Autowired还可以注入List和Map,比如我定义两Bean:

    1. @Bean("user1")
    2. User user1() {
    3. return new User("1", "a");
    4. }
    5. @Bean("user2"))
    6. User user2() {
    7. return new User("2", "b");
    8. }

    然后我写一个Controller:

    1. import com.example.demo.domain.User;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. import java.util.Collections;
    6. import java.util.HashMap;
    7. import java.util.List;
    8. import java.util.Map;
    9. @RestController
    10. public class MyController {
    11. @Autowired(required = false)
    12. private List<User> users = Collections.emptyList();
    13. @Autowired(required = false)
    14. private Map<String,User> userMap = new HashMap<>();
    15. @RequestMapping("/list")
    16. public Object listUsers() {
    17. return users;
    18. }
    19. @RequestMapping("/map")
    20. public Object mapUsers() {
    21. return userMap;
    22. }
    23. }

    在controller中通过:

    1. @Autowired(required = false)
    2. private List<User> users = Collections.emptyList();
    3. @Autowired(required = false)
    4. private Map<String,User> userMap = new HashMap<>();

    就可以自动将两个bean注入进来,当注入map的时候,map的key必须是String类型,然后bean name将作为map的key,本例,map中将有两个key分别为user1和user2,value分别为对应的User Bean实例。
    访问http://localhost:8080/map:

    1. {
    2. "user1": {
    3. "id": "1",
    4. "name": "a"
    5. },
    6. "user2": {
    7. "id": "2",
    8. "name": "b"
    9. }
    10. }

    访问http://localhost:8080/list:

    1. [
    2. {
    3. "id": "1",
    4. "name": "a"
    5. },
    6. {
    7. "id": "2",
    8. "name": "b"
    9. }
    10. ]

    然后我们给user1和user2分别打上@Qualifier修饰符:

    1. @Bean("user1")
    2. @Qualifier("valid")
    3. User user1() {
    4. return new User("1", "a");
    5. }
    6. @Bean("user2")
    7. @Qualifier("invalid")
    8. User user2() {
    9. return new User("2", "b");
    10. }

    然后将controller中的user list 和user map分别也打上@Qualifier修饰符:

    1. import com.example.demo.domain.User;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.beans.factory.annotation.Qualifier;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.RestController;
    6. import java.util.Collections;
    7. import java.util.HashMap;
    8. import java.util.List;
    9. import java.util.Map;
    10. @RestController
    11. public class MyController {
    12. @Autowired(required = false)
    13. @Qualifier("valid")
    14. private List<User> users = Collections.emptyList();
    15. @Autowired(required = false)
    16. @Qualifier("invalid")
    17. private Map<String,User> userMap = new HashMap<>();
    18. @RequestMapping("/list")
    19. public Object listUsers() {
    20. return users;
    21. }
    22. @RequestMapping("/map")
    23. public Object mapUsers() {
    24. return userMap;
    25. }
    26. }

    那么所有标注了@Qualifier(“valid”)的user bean都会自动注入到List users中去(本例是user1),所有标注了@Qualifier(“invalid”)的user bean都会自动注入到Map userMap中去(本例是user2),我们再次访问上面两个url:

    访问http://localhost:8080/list:

    1. [
    2. {
    3. "id": "1",
    4. "name": "a"
    5. }
    6. ]

    访问http://localhost:8080/map:

    1. {
    2. "user2": {
    3. "id": "2",
    4. "name": "b"
    5. }
    6. }

    看到这里我们可以理解@LoadBalanced的用处了,其实就是一个修饰符,和@Qualifier一样,比如我们给user1打上@LoadBalanced:

    1. @Bean("user1")
    2. @LoadBalanced
    3. User user1() {
    4. return new User("1", "a");
    5. }
    6. @Bean("user2")
    7. User user2() {
    8. return new User("2", "b");
    9. }

    然后controller中给List users打上@LoadBalanced注解:

    1. @Autowired(required = false)
    2. @LoadBalanced
    3. private List<User> users = Collections.emptyList();

    访问http://localhost:8080/list:

    1. [
    2. {
    3. "id": "1",
    4. "name": "a"
    5. }
    6. ]

    和@Qualifier注解效果一样,只有user1被注入进了List,user2没有修饰符,没有被注入进去。
    另外当spring容器中有多个相同类型的bean的时候,可以通过@Qualifier来进行区分,以便在注入的时候明确表明你要注入具体的哪个bean,消除歧义