@Autowired與@Resource
阿新 • • 發佈:2018-11-07
@Autowired和@Resource都用於依賴物件的自動裝配
@Autowired
- 按照型別(byType)裝配依賴物件
- IOC容器中有且僅有一個該型別的物件,將該物件注入
- IOC容器中沒有該型別的物件,且依賴變數可為空
- 解決辦法:
@Autowired(required = false)
- 解決辦法:
- IOC容器中有多個該型別物件,Spring不知道應該繫結哪個物件會報錯
- 解決辦法:和@Qualifier註解配合使用,改成按照名稱(byName)裝配
@Autowired @Qualifier(
@Resource
@Resource有兩個重要的屬性:name、type
@Resource//預設按照ByName裝配依賴物件
private UserService userService;
@Resource(name="userService")// 按byName裝配
private UserService userService;
@Resource(type="UserService")// 按byType裝配
private UserService userService;
@Resource(type="UserService",name="userService")// 按byType、byName共同查詢來裝配
private UserService userService;
@Autowired裝配List、Map
大部分是用@Autowired來注入一個bean,其實@Autowired還可以注入List和Map
// 定義四個同類型的bean
@Bean("user1")
@Qualifier("valid")
User user1() {
return new User ("1", "a");
}
@Bean("user2")
@Qualifier("valid")
User user2() {
return new User("1", "b");
}
@Bean("user3"))
@Qualifier("invalid")
User user3() {
return new User("2", "c");
}
@Bean("user4"))
@Qualifier("invalid")
User user4() {
return new User("2", "d");
}
// controller中注入List/Map
@Autowired(required = false)
@Qualifier("valid")
private List<User> users = Collections.emptyList();// 只有user1、user2注入進來
@Autowired(required = false)
@Qualifier("invalid")
private Map<String,User> userMap = new HashMap<>();// 只有user3、user4注入進來
//當注入map時,map的key必須是String型別,bean name將作為map的key