@resource默认按名称匹配,@autowired默认按类型匹配;前者先以字段名查bean id,后者先按接口类型搜实现类,查找顺序相反。

@Resource 和 @Autowired 都能完成依赖注入,但字段上使用时,它们的匹配逻辑起点完全不同:一个先看“叫什么”,一个先看“是什么”。
默认匹配顺序相反
@Resource 默认按名称(byName)查找——它先拿字段名当 Bean ID 去 Spring 容器里找。比如:@Resource private UserDao userDao;,会优先尝试找 ID 为 userDao 的 Bean。
@Autowired 默认按类型(byType)查找——它先根据 UserDao 这个接口类型,在容器中搜所有实现类的 Bean。只要找到唯一一个,就直接注入。
- 如果 @Resource 按名称没找到,才会退化为按类型查找;找不到或找到多个类型匹配项,就报错
- 如果 @Autowired 按类型找到多个(如 OracleUserDao 和 MySqlUserDao),才用字段名二次匹配;仍不唯一,必须加
@Qualifier
显式指定匹配方式的方式不同
@Resource 通过自身属性控制行为:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- @Resource(name = "mySqlUserDao") → 强制 byName,只认这个 ID,找不到直接失败
- @Resource(type = UserDao.class) → 强制 byType,要求类型唯一,多于一个就失败
- @Resource(name = "xxx", type = Xxx.class) → 同时校验名称和类型,二者都必须匹配
@Autowired 没有内置 name 或 type 属性,必须搭配 @Qualifier("xxx") 实现 byName,且不能单独指定 type。
对多实现类场景的实际影响
当接口有多个实现类时:
- 写 @Autowired private UserDao userDao; → 直接报
NoUniqueBeanDefinitionException(类型不唯一) - 写 @Resource private UserDao userDao; → 先找 ID 为
userDao的 Bean,没找到才查类型;若类型也不唯一,同样报错 - 更稳妥的做法是:@Autowired @Qualifier("mySqlUserDao") 或 @Resource(name = "mySqlUserDao")
是否依赖 Spring 生态
@Autowired 是 Spring 专属注解,离开 Spring 容器就无效;@Resource 是 Java 标准(JSR-250),理论上可在任何兼容该规范的容器中使用,迁移成本更低。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










