“ 最近在研究大佬代碼的時候,學到一種比較高大上的注入方式,今天我們就一起來看看”
衆所周知 Spring Bean 的注入方式一般有三種:
1、構造器注入
2、Setter注入
3、基于注解的
@Autowired
自動裝配(Field 注入)
其實在大部分人的開發過程中用的最多的應該都是 @Autowired 這種方式進行注入,因為這種方式比較簡便,看起來也比較明了
但是官方是比較推薦我們使用 構造器 來進行注入,為什麼不推薦我們使用自動裝配的方法呢?
今天我們來看看對比一下這兩種注入方式,看看到底該使用哪一種
01
—
@Autowired 注入
// Autowired注入public class Demo(){ @Autowired private DemoTest demoTest;}
優點
- 代碼比較少,看起來簡潔明了
- 新增依賴十分友善,不需要修改原有代碼
- 注入簡單,隻需要使用
注解或者@Autowired
注解@Resource
缺點
- 比較容易出現空指針異常,而且在編譯時期是不會暴露出來,這就導緻了空指針異常無法盡早的暴露出來
- 對單元測試不友好,如果使用 Field 注入,那麼進行單元測試就需要初始化整個Spring 環境,會将所有 Bean 執行個體化
- 會出現循環依賴的隐患
-
// Autowired注入public class DemoTest(){ @Autowired private Demo demo;}
-
// Autowired注入public class Demo(){ @Autowired private DemoTest demoTest;}
- 容易破壞單一職責原則
02
—
構造器注入
public class Demo(){ // 用 final 修飾,遵從依賴不可變原則 priavate final DemoTest demoTest; public Demo(DemoTest demoTest){ this.demoTest = demoTest; }}
優點
- 解決了依賴循環的問題(spring 的三層緩存機制)
- 強依賴處理,在編譯階段就能暴露出問題
- 友善單元測試
- 可以明确的指出依賴關系
缺點
-
代碼備援,閱讀不友好
但是這個缺點,我們可以通過 Lombok 來進行解決,隻需要在類上增加注解 @AllArgsConstructor
-
@AllArgsConstructorpublic class Demo(){ // 用 final 修飾,遵從依賴不可變原則 priavate final DemoTest demoTest;}
-
相信看完上面的對比之後,你的心中已經有了選擇。