@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;@RestControllerpublic 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;@RestControllerpublic 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 版权声明:本文为博主原创文章,转载请附上博文链接!