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