@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); } }
标签:Resource,Autowired,add,userService,public,正确理解,注入 From: https://www.cnblogs.com/chuhecc/p/17732274.html