@Autowired和@Resource都用于依赖对象的自动装配
@Autowired
- 按照类型(byType)装配依赖对象
- IOC容器中有且仅有一个该类型的对象,将该对象注入
- IOC容器中没有该类型的对象,且依赖变量可为空
- 解决办法:
@Autowired(required = false)
- 解决办法:
- IOC容器中有多个该类型对象,Spring不知道应该绑定哪个对象会报错
- 解决办法:和@Qualifier注解配合使用,改成按照名称(byName)装配
@Autowired @Qualifier("userService1") //要注入的对象名(必须在IOC中存在) UserService userService;// 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