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