天天看點

為什麼使用依賴注入_Spring Bean 的注入方式,你用的是哪一種?

“ 最近在研究大佬代碼的時候,學到一種比較高大上的注入方式,今天我們就一起來看看”

為什麼使用依賴注入_Spring Bean 的注入方式,你用的是哪一種?

衆所周知 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;}
               
  • 相信看完上面的對比之後,你的心中已經有了選擇。

為什麼使用依賴注入_Spring Bean 的注入方式,你用的是哪一種?