• @Autowired还可以注入List和Map


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

    @Bean("user1")
    User user1() {
    return new User("1", "a");
    }

    @Bean("user2"))
    User user2() {
    return new User("2", "b");
    }

    然后我写一个Controller:
    import com.example.demo.domain.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    @RestController
    public class MyController {

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

    @Autowired(required = false)
    private Map<String,User> userMap = new HashMap<>();

    @RequestMapping("/list")
    public Object listUsers() {
    return users;
    }
    @RequestMapping("/map")
    public Object mapUsers() {
    return userMap;
    }
    }

    在controller中通过:
    @Autowired(required = false)
    private List<User> users = Collections.emptyList();

    @Autowired(required = false)
    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:

    {
    "user1": {
    "id": "1",
    "name": "a"
    },
    "user2": {
    "id": "2",
    "name": "b"
    }
    }

    访问http://localhost:8080/list:
    [
    {
    "id": "1",
    "name": "a"
    },
    {
    "id": "2",
    "name": "b"
    }
    ]

    然后我们给user1和user2分别打上@Qualifier修饰符:
    @Bean("user1")
    @Qualifier("valid")
    User user1() {
    return new User("1", "a");
    }

    @Bean("user2")
    @Qualifier("invalid")
    User user2() {
    return new User("2", "b");
    }

    然后将controller中的user list 和user map分别也打上@Qualifier修饰符:
    import com.example.demo.domain.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    @RestController
    public class MyController {

    @Autowired(required = false)
    @Qualifier("valid")
    private List<User> users = Collections.emptyList();

    @Autowired(required = false)
    @Qualifier("invalid")
    private Map<String,User> userMap = new HashMap<>();

    @RequestMapping("/list")
    public Object listUsers() {
    return users;
    }
    @RequestMapping("/map")
    public Object mapUsers() {
    return userMap;
    }
    }
    那么所有标注了@Qualifier("valid")的user bean都会自动注入到List<user> users中去(本例是user1),所有标注了@Qualifier("invalid")的user bean都会自动注入到Map<String,User> userMap中去(本例是user2),我们再次访问上面两个url:


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

    [
    {
    "id": "1",
    "name": "a"
    }
    ]
    访问http://localhost:8080/map:
    {
    "user2": {
    "id": "2",
    "name": "b"
    }
    }

    看到这里我们可以理解@LoadBalanced的用处了,其实就是一个修饰符,和@Qualifier一样,比如我们给user1打上@LoadBalanced:
    @Bean("user1")
    @LoadBalanced
    User user1() {
    return new User("1", "a");
    }

    @Bean("user2")
    User user2() {
    return new User("2", "b");
    }

    然后controller中给List<User> users打上@LoadBalanced注解:
    @Autowired(required = false)
    @LoadBalanced
    private List<User> users = Collections.emptyList();


    访问http://localhost:8080/list:
    [
    {
    "id": "1",
    "name": "a"
    }
    ]

    和@Qualifier注解效果一样,只有user1被注入进了List,user2没有修饰符,没有被注入进去。
    另外当spring容器中有多个相同类型的bean的时候,可以通过@Qualifier来进行区分,以便在注入的时候明确表明你要注入具体的哪个bean,消除歧义。
    ---------------------
    作者:xiao_jun_0820
    来源:CSDN
    原文:https://blog.csdn.net/xiao_jun_0820/article/details/78917215
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    day 17
    day 16
    信息系统项目管理师 教程学习 第一章
    服务器安全防护
    少有人走的路
    Python文件学习
    测试新文章
    测试
    python基础 一、 数值类型、序列类型和散列类型
    apache No input filespecified
  • 原文地址:https://www.cnblogs.com/miracle77hp/p/10106633.html
Copyright © 2020-2023  润新知