全面正确理解 @Autowired 和 @Resource

发布时间 2023-09-27 11:28:59作者: 初和

@Autowired和@Resource都是Spring/Spring Boot项目中,用来进行依赖注入的注解。他们的区别主要是下面几点:

  1.来源不同;
  2.依赖查找的顺序不同;
  3.支特的参数不同;
  4.依赖注入的用法不同:

一、来源不同。

  @Autowire 是来自 spring 的注解,@Resource 是来自 Java 的注解。(JSR-250)

  小知识:JSR是Java Specification Requests的缩写,意思是“Java规范提案”。任何人都可以提交JSR给Java官方,但只有最终确定的JSR,才会以JSR-XXX的格式发布,如JSR-250,而被发布的

JSR就可以看作是Java语言的规范或标准。

二、依赖查找的顺序不同 

  @Autowire 是先按照 byType 去查找,再按照 byName去查找。

  查看 org.springframework.bean.factory.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 分析得出,执行流程如下: 

  @Resource 是先按照 byName 去查找,再按照 byType 去查找。

  查看 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues 分析得出,执行流程如下:

 三、支持的参数不同。

  @Autowired 和 @Resource 在使用时都可以设置参数,比如给@Resource注解设置name和type参数,实现代码如下:

@Resource(name = "userinfo",type = UserInfo.class)
private UserInfo user;

  @Autowired 只支持一个参数:

  @Resource 支持七个参数:

四、依赖注入的用法不同。

  @Autowired 支持属性注入、构造方法注入和Setter注入。@Resource 只支持属性注入和 Setter 注入。

/* 属性注入 */
@RestController
public class UserController {
    // 属性注入
    @Autowired
    private UserService userService;
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}


/* 构造方法注入 */
@RestController
public class UserController {
    // 构造方法注入
    private UserService userService;
 
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}
/* 构造方法注入 */ @RestController public class UserController { // Setter 注入 private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } @RequestMapping("/add") public UserInfo add(String username, String password) { return userService.add(username, password); } }