@autowired是spring原生注解,按类型优先匹配,支持构造器注入和required=false;@resource是java标准注解,按名称优先匹配,仅支持字段和方法注入,无required属性,兼容性更强。

@Autowired 和 @Resource 都能完成依赖注入,但底层逻辑、匹配方式和适用场景完全不同。选错不仅容易报错,还可能让代码在不同容器中行为不一致。
来源和标准不同
@Autowired 是 Spring 自家的注解(org.springframework.beans.factory.annotation.Autowired),只在 Spring 生态里有效;@Resource 是 Java 标准(JSR-250,jakarta.annotation.Resource 或旧版 javax.annotation.Resource),属于 JDK 原生能力,不依赖 Spring —— 这意味着它在其他符合 Java EE/Jakarta EE 规范的容器(如 WildFly、Tomcat + Jakarta EE 支持)中也能用。
匹配顺序完全相反
这是最核心的区别,直接影响注入结果:
-
@Autowired 默认按类型(byType)找:先查容器中有没有匹配接口/类类型的 Bean;如果找到多个,再用字段名(如
userDao)去匹配 Bean 名称;若仍不确定,必须加@Qualifier("xxx")显式指定 -
@Resource 默认按名称(byName)找:直接用字段名(如
userDao)当 Bean 名去查;没找到才退回到按类型查找;想指定名称,直接写@Resource(name = "userDaoMysql")
支持的位置和参数有差异
@Autowired 可用于构造器、方法、参数、字段,且支持 required = false(找不到不报错,变量为 null);@Resource 只支持字段和方法(不能用在构造器或方法参数上),没有 required 属性——找不到就直接抛 NoSuchBeanDefinitionException。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
另外,@Resource 还支持 type 属性,比如 @Resource(type = UserDao.class) 强制按类型匹配,但一般不建议 name 和 type 同时指定,容易引发歧义。
Spring 官方推荐和实际建议
Spring 团队明确推荐使用 @Autowired + 构造器注入,因为:
- 依赖关系清晰可见,字段可声明为
final - 避免空指针,天然支持不可变设计
- 单元测试更方便(直接 new 实例传参即可)
@Resource 更适合已有 Java EE 项目迁移,或需要保持跨框架兼容性的场景;日常 Spring Boot 开发中混用两者会增加理解成本,不建议随意切换。字段注入(无论用哪个注解)都不推荐,IDEA 通常也会警告。










