@Autowired按類型注入,需@Qualifier或@Primary解決多實(shí)例歧義;@Resource優(yōu)先按名稱注入,名稱不匹配時按類型,更利于名稱明確的場景。
@Autowired 側(cè)重于按類型進(jìn)行依賴注入,是 Spring 框架特有的;而 @Resource 則優(yōu)先按名稱進(jìn)行注入,是 Java EE 規(guī)范的一部分,可以脫離 Spring 獨(dú)立使用。
理解
@Autowired
@Resource
@Autowired:Spring 的類型優(yōu)先策略
@Autowired
@Autowired
例如:
@Component public class MyService { @Autowired private MyRepository myRepository; // Spring會尋找MyRepository類型的Bean // ... }
這里,Spring 會在容器中查找
MyRepository
MyRepository
MyRepository
MyRepositoryImplA
MyRepositoryImplB
MyRepository
NoUniqueBeanDefinitionException
為了解決這種歧義,你可以配合
@Qualifier
@Component public class MyService { @Autowired @Qualifier("myRepositoryImplA") // 明確指定Bean的名稱 private MyRepository myRepository; // ... }
或者,你也可以將其中一個實(shí)現(xiàn)類標(biāo)記為
@Primary
@Component @Primary public class MyRepositoryImplA implements MyRepository { /* ... */ } @Component public class MyRepositoryImplB implements MyRepository { /* ... */ } // MyService中無需@Qualifier,Spring會默認(rèn)注入MyRepositoryImplA @Component public class MyService { @Autowired private MyRepository myRepository; // ... }
@Resource:Java EE 的名稱優(yōu)先策略
@Resource
當(dāng)你在一個字段或 Setter 方法上使用
@Resource
@Resource
@Component public class MyService { @Resource private MyRepository myRepositoryImplA; // 會嘗試查找名為"myRepositoryImplA"的Bean // ... }
如果找到了,就注入。
@Resource
你也可以通過
@Resource
name
@Component public class MyService { @Resource(name = "myRepositoryImplA") // 明確指定Bean的名稱 private MyRepository myRepository; // ... }
或者通過
type
name
@Component public class MyService { @Resource(type = MyRepository.class) // 按類型查找 private MyRepository someRepository; // ... }
總結(jié)來說,核心差異是:
@Autowired
Qualifier
@Resource
在 Spring Boot 的日常開發(fā)中,選擇
@Autowired
@Resource
我個人在多數(shù)情況下會更傾向于使用
@Autowired
@Autowired
@Autowired
@Autowired
@Qualifier
然而,在某些特定的場景下,我會發(fā)現(xiàn)
@Resource
@Resource
再比如,如果我需要在代碼中顯式地通過一個字符串名稱來引用一個 Bean(這在某些動態(tài)配置或工廠模式中可能會出現(xiàn)),那么
@Resource(name="beanName")
@Autowired
@Qualifier("beanName")
另外,從代碼的可移植性角度看,
@Resource
@Resource
所以,我的經(jīng)驗(yàn)是:對于大多數(shù) Spring Boot 應(yīng)用的內(nèi)部組件依賴,
@Autowired
@Resource
處理多個相同類型的 Bean,是我們在 Spring 開發(fā)中經(jīng)常會遇到的一個挑戰(zhàn),也是區(qū)分
@Autowired
@Resource
@Autowired 的處理方式:
當(dāng) Spring 容器中存在多個類型相同的 Bean,而你又使用了
@Autowired
NoUniqueBeanDefinitionException
為了解決這個問題,通常有以下幾種方法:
使用 @Qualifier
@Autowired
@Qualifier("beanName")
@Service("smsSender") public class SmsSender implements MessageSender { /* ... */ } @Service("emailSender") public class EmailSender implements MessageSender { /* ... */ } @Component public class NotificationService { @Autowired @Qualifier("emailSender") // 明確指定注入名為 "emailSender" 的Bean private MessageSender messageSender; }
使用 @Primary
@Primary
@Primary
@Service @Primary // 優(yōu)先選擇這個發(fā)送器 public class DefaultSmsSender implements MessageSender { /* ... */ } @Service public class BackupEmailSender implements MessageSender { /* ... */ } @Component public class NotificationService { @Autowired // 會自動注入 DefaultSmsSender private MessageSender messageSender; }
通過參數(shù)名匹配(作為后備): 如果沒有
@Qualifier
@Primary
@Resource 的處理方式:
@Resource
優(yōu)先按名稱查找: 當(dāng)你使用
@Resource
@Service("smsSender") public class SmsSender implements MessageSender { /* ... */ } @Service("emailSender") public class EmailSender implements MessageSender { /* ... */ } @Component public class NotificationService { @Resource // 嘗試查找名為 "smsSender" 的Bean private MessageSender smsSender; @Resource // 嘗試查找名為 "emailSender" 的Bean private MessageSender emailSender; }
如果按名稱未找到,再按類型查找: 如果
@Resource
@Resource
@Resource
所以,從處理多 Bean 的角度看,
@Resource
@Autowired
@Qualifier
@Primary
談到代碼的可移植性和規(guī)范性,
@Autowired
@Resource
@Autowired:Spring 框架的深度整合與便捷性
@Autowired
@Autowired
@Autowired
@Autowired
@Autowired
@Autowired
@Qualifier
@Primary
@Resource:Java EE 標(biāo)準(zhǔn)的通用性與規(guī)范性
@Resource
@Resource
@Resource
@Resource
@Autowired
@Resource
@Autowired
@Resource
我的看法:
在我的實(shí)際開發(fā)經(jīng)驗(yàn)中,如果項(xiàng)目是全新的 Spring Boot 應(yīng)用,且不預(yù)期有任何脫離 Spring 框架的可能,我通常會選擇
@Autowired
@Resource
以上就是@Autowired 和 @Resource 注解的區(qū)別是什么?的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號