一. 对象装配 / 对象注入 的三种方法
1.属性注入
使用 @Autowired 注解实现
具体代码展示:如下,两个类都在Spring 中,现在使用 @Autowired 注解 ,将 UserService 对象注入到 UserController 中,并调用 UserService 中的 doService() 方法。
具体代码:
@Autowired
private UserService userService;
2.构造方法注入
同样使用 @Autowired 注解,使用过程同上,具体实现代码展示如下:
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
注意点:
1.构造方法是当前类的构造方法。
2.如果当前类中只有一个构造方法,那么可以不用写 @Autowired 注解。
3.如果有多个构造方法,只能在一个构造方法上写 @Autowired 注解,不然会报错。
3.setter 注入
同样也是通过 @Autowired 注解,在 setter 方法上进行添加,从而达到注入的效果。
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
二.实现注入的另一个关键字 —— @ Resource
@Resource 注解 是来自于Java 的 javax.annotation.Resource。 它的功能与@Autowired 相似,体现在属性注入和setter 注入上,用法与 @Autowired 完全一致。但@Resource 不支持 构造方法的注入,原因主要是,@Resource 注解的执行在构造方法之后。
@Autowired VS @Resource 的比较
二者比较起来可以发现,@Resource 有许多的参数,而 @Autowired 仅仅只有一个参数。
同一个类型多个 @Bean 报错
我们可能会遇到这样的问题,如下图:
我们在类中创建了两个方法,并通过 @Bean 注解将其存入到 Spring 中,
我们使用 @Resource 注解,将User 类型的 user 注入到其他类中,但我们可以发现在Spring中,并没有 与之匹配的 user ,只存在 user1 和 user2,此时运行程序会报错:非唯一的 Bean 对象。
因此,就需要使用到 @Resource 中的参数来进行,确认谁与之匹配,或者将@qualifier 与@Autowired 搭配起来使用,具体做法如下:
@Resource(name = "user1")
private User user;
public User getUser() {
return user;
}
@Autowired
@Qualifier(value = "user1")
private User user;
public User getUser() {
return user;
}