@Autowired与@Resource

@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

猜你喜欢

转载自blog.csdn.net/xuexuan_050848/article/details/83754733