做開發(fā)的同學(xué)可能都會(huì)發(fā)現(xiàn), IDEA 在我們經(jīng)常使用的@Autowired
注解上添加了警告: Field injection is not recommended, 即: 不推薦使用屬性注入。那怎么解決這個(gè)問題呢?
問題原因
違背單一職責(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ǎng)絡(luò)上有一些其他方面的總結(jié),比如:因?yàn)槭?ByType 注入, 因此有可能會(huì)出現(xiàn)兩個(gè)相同的類型bean,進(jìn)而導(dǎo)致Spring裝配失?。徊荒芟駱?gòu)造器那樣注入不可變的對(duì)象等,這類問題需要結(jié)合個(gè)人實(shí)際開發(fā)進(jìn)行判斷。
對(duì)于@Autowired
使用方面,它雖然是將業(yè)務(wù)代碼和框架進(jìn)行了強(qiáng)綁定,但字段注入確實(shí)大幅簡化了代碼。能夠有效提高代碼簡潔性,讓依賴注入的事情交給IOC容器,省時(shí)省力,這也是它的優(yōu)點(diǎn),我們應(yīng)該在實(shí)際使用中追求平衡,否則將為了過度追求松耦合而得不償失。
其他注入方法
除了使用@Autowired
以外,我們其實(shí)也有幾種好用的方式。使用@Resource
替代@Autiwired
方法是其中一種,只需要改變一個(gè)注解,這里就不展示了。
Setter注入
能夠通過懶加載的方式解決循環(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)依賴問題。是最可靠的方法。
但其也有缺點(diǎn),假如類中需要注入的依賴比較多,就會(huì)顯得構(gòu)造方法很臃腫,缺乏可讀性。另外,構(gòu)造器注入不能解決循環(huán)依賴問題。
構(gòu)造器簡化版(推薦)
首先,需要引入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;
}
通過查看編譯結(jié)果,發(fā)現(xiàn)Lombok自動(dòng)生成了構(gòu)造方法,非常簡便。
總結(jié)
最不推薦使用的是 屬性注入 ,除了省力以外沒有好處。
Setter注入 和 構(gòu)造器注入 各有優(yōu)劣,需要根據(jù)實(shí)際情況選擇。
最推薦使用 Lombok版的構(gòu)造器注入 方式,既簡單又可靠。
-
JAVA
+關(guān)注
關(guān)注
19文章
2952瀏覽量
104477 -
框架
+關(guān)注
關(guān)注
0文章
398瀏覽量
17404 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68229 -
spring
+關(guān)注
關(guān)注
0文章
338瀏覽量
14295
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論