做開(kāi)發(fā)的同學(xué)可能都會(huì)發(fā)現(xiàn), IDEA 在我們經(jīng)常使用的@Autowired
注解上添加了警告: Field injection is not recommended, 即: 不推薦使用屬性注入。那怎么解決這個(gè)問(wèn)題呢?
問(wèn)題原因
違背單一職責(zé)原則
因?yàn)楝F(xiàn)在的業(yè)務(wù)一般都會(huì)使用很多依賴, 但擁有太多的依賴通常意味著承擔(dān)更多的責(zé)任,而這顯然違背了單一職責(zé)原則。
依賴Spring
@Autowired
由 Spring 提供,而@Resource
是JSR-250提供的,它是Java標(biāo)準(zhǔn)。前者會(huì)警告,而后者不警告,就是因?yàn)榍罢邔?dǎo)致了應(yīng)用與框架的強(qiáng)綁定,若是換成其他IOC框架,則不能夠成功注入了。其實(shí)對(duì)于這方面,我認(rèn)為在大多數(shù)情況時(shí)是不會(huì)有什么問(wèn)題的。
其他
我看到網(wǎng)絡(luò)上有一些其他方面的總結(jié),比如:因?yàn)槭?ByType 注入, 因此有可能會(huì)出現(xiàn)兩個(gè)相同的類型bean,進(jìn)而導(dǎo)致Spring裝配失敗;不能像構(gòu)造器那樣注入不可變的對(duì)象等,這類問(wèn)題需要結(jié)合個(gè)人實(shí)際開(kāi)發(fā)進(jìn)行判斷。
對(duì)于@Autowired
使用方面,它雖然是將業(yè)務(wù)代碼和框架進(jìn)行了強(qiáng)綁定,但字段注入確實(shí)大幅簡(jiǎn)化了代碼。能夠有效提高代碼簡(jiǎn)潔性,讓依賴注入的事情交給IOC容器,省時(shí)省力,這也是它的優(yōu)點(diǎn),我們應(yīng)該在實(shí)際使用中追求平衡,否則將為了過(guò)度追求松耦合而得不償失。
其他注入方法
除了使用@Autowired
以外,我們其實(shí)也有幾種好用的方式。使用@Resource
替代@Autiwired
方法是其中一種,只需要改變一個(gè)注解,這里就不展示了。
Setter注入
能夠通過(guò)懶加載的方式解決循環(huán)依賴,類中的依賴在需要用到的時(shí)候才會(huì)注入。另外,setter注入方式很靈活,注入的對(duì)象還能改變。
@RestController
public class DemoController {
private DemoService demoService;
/*
* 基于set注入
* */
@Autowired
public void setDemoService(DemoService demoService) {
this.demoService = demoService;
}
}
這種方法也使用了@Autowired
注解,但是它是作用于成員變量的Setter函數(shù)上,而不是像Field注入一樣作用于成員變量上。
這是三種注入方式中最靈活的,這個(gè)靈活就是它的缺點(diǎn)。Setter注入的依賴不能保證依賴不可變。
構(gòu)造器
@RestController
public class DemoController {
private DemoService demoService;
/*
* 基于構(gòu)造方法的注入
* */
public DemoController(DemoService demoService) {
this.demoService = demoService;
}
}
它的好處在于,采用了構(gòu)造方法注入,這種方式對(duì)對(duì)象創(chuàng)建的順序會(huì)有要求,它將避免循環(huán)依賴問(wèn)題。是最可靠的方法。
但其也有缺點(diǎn),假如類中需要注入的依賴比較多,就會(huì)顯得構(gòu)造方法很臃腫,缺乏可讀性。另外,構(gòu)造器注入不能解決循環(huán)依賴問(wèn)題。
構(gòu)造器簡(jiǎn)化版(推薦)
首先,需要引入lombok依賴。
< dependency >
< groupId >org.projectlombok< /groupId >
< artifactId >lombok< /artifactId >
< /dependency >
隨后,我們?cè)趧?chuàng)建時(shí)就可以使用@RequiredArgsConstructor
注解,它將幫我們創(chuàng)建構(gòu)造器,注意,屬性必須添加 final 關(guān)鍵字。
@RestController
@RequiredArgsConstructor
public class DemoController {
/*
* 用@RequiredArgsConstructor注解,這個(gè)使用方式也可以應(yīng)用于service層
* */
private final DemoService demoService;
}
通過(guò)查看編譯結(jié)果,發(fā)現(xiàn)Lombok自動(dòng)生成了構(gòu)造方法,非常簡(jiǎn)便。
總結(jié)
最不推薦使用的是 屬性注入 ,除了省力以外沒(méi)有好處。
Setter注入 和 構(gòu)造器注入 各有優(yōu)劣,需要根據(jù)實(shí)際情況選擇。
最推薦使用 Lombok版的構(gòu)造器注入 方式,既簡(jiǎn)單又可靠。
-
JAVA
+關(guān)注
關(guān)注
19文章
2970瀏覽量
104804 -
框架
+關(guān)注
關(guān)注
0文章
403瀏覽量
17504 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68677 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14353
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論