@Resource和@Autowired注入区别
注解 | 来源 | 主要匹配方式 | 是否按类型 | 是否按名称 | 是否支持 required=false |
---|---|---|---|---|---|
@Autowired | Spring 专有 | 按类型 优先 | ✅ 是 | ⚙️ 名称只在歧义时辅助 | ✅ 支持 |
@Resource | JSR-250(Java 标准) | 按名称 优先 | ⚙️ 是(次要) | ✅ 是 | ❌ 不支持 |
@Autowired:
Spring 自家的注入方式,默认根据类型(byType) 找 Bean,如果找到多个相同类型,再根据变量名匹配 Bean 名称。
@Autowired
private XieqiaoOrgSync xieqiaoOrgSync; // Spring 会找类型为 XieqiaoOrgSync 的 Bean
@Resource:
来自 Java 标准(javax.annotation.Resource),默认根据名称(byName)。
如果你写的是:
@Resource
private ICusPfUserService cusPfUserService;
Spring 会先查找 名为 “cusPfUserService” 的 Bean,找不到时再按类型匹配。
🏗️ 三、为什么在不同地方用得不一样
✅ 1. @Autowired 常用于普通组件(如工具类、配置类、任务类)
比如:
@Component
public class XieqiaoOrgSync {
public void startSync() { … }
}
@Autowired
private XieqiaoOrgSync xieqiaoOrgSync;
这里类名和 Bean 名是相同的,@Autowired 按类型匹配最方便、最自然。
✅ 2. @Resource 常用于 ServiceImpl 之间互相引用
比如:
@Service
public class CusPfUserServiceImpl implements ICusPfUserService {
@Resource
private PfUserService pfUserService;
}
为什么?因为很多 Service 都是通过 接口 + 实现类 的形式存在,比如:
public interface ICusPfUserService { … }
@Service
public class CusPfUserServiceImpl implements ICusPfUserService { … }
在这种情况下:
使用 @Autowired 会按类型找,可能匹配到多个实现类(如果有别的同接口实现)。
使用 @Resource 则可以精确按 字段名(即 Bean 名) 匹配,避免歧义。
场景 | 推荐注解 | 理由 |
---|---|---|
只有一个实现类 | @Autowired | 简洁直接 |
存在多个同接口实现类 | @Resource | 按名称更安全 |
需要 required=false | @Autowired | @Resource 不支持 |
想用构造器注入 | @Autowired | 推荐写法(更易测试) |
对比点 | @Autowired | @Resource |
---|---|---|
默认匹配方式 | 按类型 | 按名称 |
是否支持 required=false | ✅ 是 | ❌ 否 |
支持构造器注入 | ✅ 是 | ❌ 否 |
是否是 Spring 专属 | ✅ 是 | ❌ 是标准 JSR |
推荐用途 | 工具类 / 配置类 | 多实现 Service / DAO |