@resource按名称查找bean,找不到再按类型;@autowired按类型查找,多个时再按名称匹配。前者是java标准,后者为spring专属;前者支持name/type属性,后者需@qualifier指定名称。

@Resource 和 @Autowired 都能完成依赖注入,但底层逻辑和使用习惯差异明显,关键不在“能不能用”,而在“按什么规则找 Bean”。
查找顺序完全不同
这是最常被忽略、也最容易出问题的一点:
- @Autowired 默认按类型(byType)找:先看字段/参数是什么类型,去容器里找这个类型的 Bean;如果找到多个,再拿变量名当 Bean 名去匹配;匹配不上就报错
- @Resource 默认按名称(byName)找:直接用字段名(如 userService)作为 Bean 名去查;查不到,才退回去按类型找;但按类型找到多个就直接失败,不支持二次筛选
来源和标准归属不同
这决定了项目迁移和框架兼容性:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- @Autowired 是 Spring 专属,包路径是 org.springframework.beans.factory.annotation.Autowired,脱离 Spring 就无效
- @Resource 是 Java 官方标准(JSR-250),包路径是 javax.annotation.Resource 或 jakarta.annotation.Resource,JDK 原生支持,其他 Java EE 框架也能识别
配置方式和灵活性有差别
遇到多 Bean 场景时,解决思路不一样:
- @Autowired 必须配合 @Qualifier("xxx") 显式指定 Bean 名,不能直接写在注解里;支持 required=false 允许注入 null
- @Resource 可直接写 @Resource(name="xxx") 或 @Resource(type=UserService.class);没有 required 属性,找不到就启动失败
可用位置略有不同
影响代码可测性和设计风格:
- @Autowired 支持构造器、字段、方法、甚至参数级注入,Spring 官方推荐构造器注入
- @Resource 支持字段和方法,但一般不用于构造器(Spring 虽兼容,但语义上不自然,IDE 也可能报黄线)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










