全面正确理解 @Autowired 和 @Resource
@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); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~