為什么 Spring 和 IDEA 不推薦使用 @Autowired 注解
在開發(fā)過程中,你是否遇到過這樣一種情況?
在IDEA中,當(dāng)你在字段上使用
@Autowired注解進(jìn)行依賴注入時(shí),IDEA常常會(huì)給出一個(gè)警告提示:“字段注入是不被推薦的”
有些同學(xué)可能注意到,使用@Resource卻沒有這樣的警告。
那么,為什么會(huì)有這樣的差異呢?
Spring的常見依賴注入方式
首先,我們需要了解Spring中的幾種常見的依賴注入(DI)方式:
- 構(gòu)造器注入:通過構(gòu)造方法的參數(shù)來傳遞依賴,確保依賴是不可變的。
- Setter注入:通過調(diào)用Setter方法來注入依賴,適合于可變依賴。
- 字段注入:直接在字段上使用
@Autowired或@Resource注解,Spring容器會(huì)自動(dòng)注入依賴。
@Autowired VS @Resource
雖然@Autowired和@Resource看似相似,它們的核心目的是一樣的——實(shí)現(xiàn)依賴注入。但實(shí)際上,它們背后有著不同的定義和機(jī)制:
- 依賴識(shí)別方式:
@Autowired默認(rèn)采用byType的方式,你可以使用@Qualifier來指定具體的bean;而@Resource則默認(rèn)采用byName,如果找不到匹配的bean,才會(huì)使用byType。 - 適用對(duì)象:
@Autowired可以用于構(gòu)造器、方法、字段等,而@Resource僅限于方法和字段。 - 提供方:
@Autowired是Spring框架提供的,而@Resource則是JSR-250標(biāo)準(zhǔn)的一部分。
各種依賴注入方式的優(yōu)缺點(diǎn)
根據(jù)Spring官方文檔,我們可以看到,每種注入方式都有其適用場(chǎng)景和特點(diǎn):
- 構(gòu)造器注入:適用于“強(qiáng)依賴”,也就是必須要有的依賴,確保依賴對(duì)象在創(chuàng)建時(shí)就是不可變的。
- Setter注入:適用于“可選依賴”,依賴對(duì)象可以是可變的,適合場(chǎng)景中依賴會(huì)發(fā)生變化。
- 字段注入:雖然字段注入的便利性很高,但也有一些缺點(diǎn)。Spring官方建議盡量少使用,除非確實(shí)需要。相較于
@Autowired,@Resource對(duì)容器的耦合性較低,因此推薦在可能的情況下使用@Resource。
字段注入的缺點(diǎn)
字段注入雖然方便,但它也帶來了一些問題:
- 不可變性差:你不能像構(gòu)造器注入那樣注入不可變的對(duì)象。
- 外部不可見性:依賴是直接注入到字段中的,外部無法清晰看到所有依賴項(xiàng),缺乏透明性。
- 緊耦合問題:字段注入會(huì)導(dǎo)致組件與IoC容器之間有較強(qiáng)的綁定,換個(gè)容器可能就不兼容了。
- 單元測(cè)試?yán)щy:字段注入需要依賴IoC容器,導(dǎo)致單元測(cè)試時(shí)也得依賴容器,這對(duì)測(cè)試的獨(dú)立性造成了影響。
- 依賴關(guān)系不清晰:如果一個(gè)類有很多依賴,使用字段注入會(huì)讓代碼變得不清晰,構(gòu)造器注入則能清晰展示每個(gè)依賴。
為什么IDEA只對(duì)@Autowired警告?
說到這里,很多人可能會(huì)問:既然字段注入有這么多問題,為什么IDEA只對(duì)@Autowired發(fā)出警告,卻對(duì)@Resource視而不見呢?
我個(gè)人認(rèn)為,根本原因在于@Autowired是Spring框架提供的特定注解。Spring是一個(gè)相對(duì)封閉的IoC容器,使用它時(shí)應(yīng)用和框架之間的綁定相對(duì)強(qiáng)。如果將來你換了其他IoC框架,@Autowired可能就不能正常工作了。
而@Resource是JSR-250標(biāo)準(zhǔn)中的一部分,它不僅支持Spring,還支持其他IoC容器。使用@Resource時(shí),依賴注入機(jī)制與框架的綁定性較低,因此更具靈活性,IDEA也就沒有對(duì)它發(fā)出警告。

































