@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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!