Spring选择哪种注入方式
1. Spring常見的注入方式
1.1 Field注入
field即在變量上直接使用注解進(jìn)行注入,內(nèi)部使用反射的方式實(shí)現(xiàn)注入到field中。
- 優(yōu)點(diǎn):代碼簡(jiǎn)潔有效,最為開發(fā)人員喜歡使用
- 缺點(diǎn):依賴對(duì)象可能為null而報(bào)空指針異常,容易出現(xiàn)循環(huán)依賴問題
1.2 setter注入
spring 3.x版本中推薦使用的注入方式,通過在set方法上使用注解完成對(duì)象注入。
- 優(yōu)點(diǎn):選擇性注入,可有可無,依賴不會(huì)影響整個(gè)項(xiàng)目運(yùn)行
- 缺點(diǎn):在對(duì)象實(shí)例化后,依賴信息依然可以通過set方法修改,不太好
1.3 構(gòu)造器注入
spring 4.x版本時(shí)Spring團(tuán)隊(duì)推薦使用的注入方式,將注解標(biāo)注在構(gòu)造函數(shù)上,對(duì)象以參數(shù)的形式傳遞,在構(gòu)造函數(shù)中完成注入對(duì)象的初始化。
- 優(yōu)點(diǎn):變量定義使用強(qiáng)制性的顯式注入(final關(guān)鍵字保證不可變)、避免空指針和循環(huán)依賴,
- 缺點(diǎn):在需要注入的依賴較多時(shí),使用構(gòu)造方法臃腫
2. Spring為什么推薦使用構(gòu)造器注入
Field注入盡管代碼上簡(jiǎn)潔有效,但是會(huì)帶來一些問題:
Setter方法注入是Spring 3.x版本推薦的注入方式,因?yàn)?strong>setter的方式能用讓類在之后重新配置或者重新注入,但是
- 寫起來比較麻煩,每個(gè)依賴都需要一個(gè)set方法
- 可以重新配置或注入雖然方便,但是有些依賴需要不可變,使用此種方式產(chǎn)生不確定性
構(gòu)造器注入是Spring 4.x 版本推薦的注入方式,主要優(yōu)點(diǎn)有:
3. @Autowired、@Resource和@Inject的區(qū)別
3.1 @Autowired
- @Autowired注解是Spring2.5之后帶入的注解,通過AutowiredAnnotationBeanPostProcessor類實(shí)現(xiàn)注入
- @Autowired可以標(biāo)注在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE之上
- @Autowired默認(rèn)根據(jù)bean類型進(jìn)行自動(dòng)裝配,byType
- @Autowired注入時(shí)如果發(fā)現(xiàn)同類型有多個(gè)bean,此時(shí)需要使用@Qualifier注解來指定bean的name,即byName
- @Autowired注解有屬性required,默認(rèn)為true,設(shè)置為false則表示未找到對(duì)應(yīng)bean時(shí)不拋出異常
3.2 @Resource
- @Resource時(shí)javax.annotation包下的注解
- @Resource可以標(biāo)注在TYPE, FIELD, METHOD之上
- @Resource是根據(jù)屬性名稱進(jìn)行自動(dòng)裝配的,其擁有屬性name,可以根據(jù)屬性值指定裝配bean的name
3.3 @Inject
@Inject注解需要導(dǎo)入javax.inject.Inject包,能實(shí)現(xiàn)注入 @Inject可以標(biāo)注在CONSTRUCTOR、METHOD、FIELD之上 @Inject注解是根據(jù)類型自動(dòng)裝配的,如果需要指定名稱,則需要配合@Named注解
4. 總結(jié)
盡管Spring 4.x 推薦使用構(gòu)造器注入,但是我們?nèi)匀豢梢允褂闷渌绞?#xff0c;且可以使用混合方式注入
- 不可變的注入使用構(gòu)造器
- 可變可選注入使用setter方法
- 對(duì)于多實(shí)現(xiàn)的依賴注入時(shí),可以使用Filed注入或者setter方法來指定注入的實(shí)現(xiàn)
- 實(shí)際使用Field注入的仍然很多,大部分是一些遺留問題,后續(xù)新項(xiàng)目可以嘗試盡量避免Field注入
總結(jié)
以上是生活随笔為你收集整理的Spring选择哪种注入方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可口的JAVA-并发控制之CountDo
- 下一篇: Spring Boot 中使用 Hika