🧩 一、@Autowired 和 @Resource 的基本作用
注解 | 來源 | 作用 |
---|---|---|
@Autowired | Spring 提供(org.springframework.beans.factory.annotation.Autowired ) | 按類型 自動注入 |
@Resource | JDK 提供(javax.annotation.Resource ) | 默認按名稱 注入,找不到再按類型 |
🚦 二、核心區別詳解
對比項 | @Autowired | @Resource |
---|---|---|
注解來源 | Spring 框架 | JDK(JSR-250 規范) |
默認注入方式 | 按類型注入(byType ) | 按名稱注入(byName ) |
是否可選 | 可以配合 @Autowired(required = false) 設置為可選 | 默認必須有該 Bean |
是否支持構造器 | ? 支持構造器注入 | ? 不支持構造器注入 |
是否支持 @Qualifier | ? 支持,用于指定具體 Bean 名稱 | ? 不支持 @Qualifier (直接用 name) |
Spring 推薦 | ? 是 | 可以用但不推薦(除非兼容舊項目) |
🔍 三、舉例對比
? 1. 使用 @Autowired
+ @Qualifier
(推薦方式)
@Component
public class MyService {@Autowired@Qualifier("userDaoImpl1")private UserDao userDao;
}
Spring 會按類型找,然后用
@Qualifier
精確到 Bean 名稱。
? 2. 使用 @Resource
@Component
public class MyService {@Resource(name = "userDaoImpl1")private UserDao userDao;
}
Spring 會直接按照
name = "userDaoImpl1"
去找 Bean。
? 3. 構造器注入(只能用 @Autowired
)
@Component
public class MyService {private final UserDao userDao;@Autowiredpublic MyService(UserDao userDao) {this.userDao = userDao;}
}
💣 四、常見坑點
1. 多個實現類時,不指定名稱會報錯
public interface UserDao {}
@Component("userDaoImpl1") class UserDaoImpl1 implements UserDao {}
@Component("userDaoImpl2") class UserDaoImpl2 implements UserDao {}
注入時:
@Autowired // ? 報錯:有兩個實現不知道選哪個
private UserDao userDao;
? 用
@Qualifier
或@Primary
來指定
2. @Resource
默認按名稱,字段名要一致!
@Resource
private UserDao userDaoImpl1; // ? 會去找名字叫 "userDaoImpl1" 的 Bean
🧠 五、一句話總結
@Autowired
是 Spring 原生推薦,默認按類型注入,配合@Qualifier
使用最靈活;
@Resource
是 JDK 標準注解,默認按名稱,適合兼容舊系統,但不如@Autowired
強大。
? 實際開發建議:
- Spring Boot 項目中:優先使用
@Autowired
+ 構造器注入 - 多實現類時:使用
@Qualifier
或@Primary
明確指定