成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么官方不推薦使用 @Autowired?

開發 前端
為什么?是 @Autowired 不行嗎?并不是。它可以用,但問題是:它不是無敵的,濫用起來容易埋坑。下面就來聊聊為啥官方建議你慎用 @Autowired,順便再帶點代碼例子,希望對你會有所幫助。

前言

很多人剛接觸 Spring 的時候,對 @Autowired 絕對是愛得深沉。

一個注解,輕松搞定依賴注入,連代碼量都省了。

誰不愛呢?

但慢慢地,尤其是跑到稍微復雜點的項目里,@Autowired 就開始給你整點幺蛾子。

于是,官方Spring 4.0開始:不建議無腦用 @Autowired,而是更推薦構造函數注入。

圖片圖片

為什么?

是 @Autowired 不行嗎?并不是。

它可以用,但問題是:它不是無敵的,濫用起來容易埋坑。

下面就來聊聊為啥官方建議你慎用 @Autowired,順便再帶點代碼例子,希望對你會有所幫助。

1. 容易導致隱式依賴

很多小伙伴在工作中喜歡直接寫:

@Service
public class MyService {
    @Autowired
    private MyRepository myRepository;
}

看著挺簡單,但問題來了:類的依賴關系藏得太深了。

  • 你看這段代碼,MyService 和 MyRepository 的關系其實是個“隱形依賴”,全靠 @Autowired 來注入。
  • 如果有個同事剛接手代碼,打開一看,完全不知道 myRepository 是啥玩意兒、怎么來的,只有通過 IDE 或運行時才能猜出來。

隱式依賴的結果就是,代碼看起來簡單,但維護起來費勁。

后期加個新依賴,或者改依賴順序,分分鐘把人搞糊涂。

怎么破?

用 構造函數注入 替代。

@Service
public class MyService {
    private final MyRepository myRepository;

    // 構造函數注入,依賴一目了然
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

這樣做的好處是:

  • 依賴清晰:誰依賴誰,直接寫在構造函數里,明明白白。
  • 更易測試:構造函數注入可以手動傳入 mock 對象,方便寫單元測試。

2. 會導致強耦合

再舉個例子,很多人喜歡直接用 @Autowired 注入具體實現類,比如:

@Service
public class MyService {
    @Autowired
    private SpecificRepository specificRepository;
}

表面上沒毛病,但這是硬邦邦地把 MyService 和 SpecificRepository 綁死了。

萬一有一天,業務改了,需要切換成另一個實現類,比如 AnotherSpecificRepository,你得改代碼、改注解,連帶著測試也崩。

怎么破?

用接口和構造函數注入,把依賴解耦。

@Service
public class MyService {
    private final Repository repository;

    public MyService(Repository repository) {
        this.repository = repository;
    }
}

然后通過 Spring 的配置文件或者 @Configuration 類配置具體實現:

@Configuration
public class RepositoryConfig {
    @Bean
    public Repository repository() {
        return new SpecificRepository();
    }
}

這么搞的好處是:

  • 靈活切換:改實現類時,不用動核心邏輯代碼。
  • 符合面向接口編程的思想:降低耦合,提升可擴展性。

3. 容易導致 NullPointerException

有些小伙伴喜歡這么寫:

@Service
public class MyService {
    @Autowired
    private MyRepository myRepository;

    public void doSomething() {
        myRepository.save(); // 啪!NullPointerException
    }
}

問題在哪?如果 Spring 容器還沒來得及注入依賴,你的代碼就跑了(比如在構造函數或初始化方法中直接調用依賴),結果自然就是 NullPointerException。

怎么破?

用構造函數注入,徹底干掉 null 的可能性。

@Service
public class MyService {
    private final MyRepository myRepository;

    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository; // 確保依賴在對象初始化時就已注入
    }

    public void doSomething() {
        myRepository.save();
    }
}

構造函數注入的另一個優點是:依賴注入是強制的,Spring 容器不給你注入就報錯,讓問題早暴露。

4.自動裝配容易搞出迷惑行為

Spring 的自動裝配機制有時候是“黑魔法”,尤其是當你的項目里有多個候選 Bean 時。比如:

@Service
public class MyService {
    @Autowired
    private Repository repository; // 容器里有兩個 Repository 實現類,咋辦?
}

如果有兩個實現類,比如 SpecificRepository 和 AnotherRepository,Spring 容器直接報錯。解決方法有兩種:

  • 指定 @Primary。
  • 用 @Qualifier 手動指定。

但這些方式都讓代碼看起來更復雜了,還可能踩坑。

怎么破?

構造函數注入 + 顯式配置。

@Configuration
public class RepositoryConfig {
    @Bean
    public Repository repository() {
        return new SpecificRepository();
    }
}

你明確告訴 Spring 該用哪個實現類,別讓容器幫你猜,省得以后“配錯藥”。

5. 寫單元測試非常痛苦

最后,聊聊測試的事兒。

@Autowired 依賴 Spring 容器才能工作,但寫單元測試時,大家都不想起 Spring 容器(麻煩、慢)。結果就是:

  • 字段注入:沒法手動傳入 mock 對象。
  • 自動裝配:有時候不清楚用的 Bean 是哪個,測試難搞。

怎么破?

構造函數注入天生就是為單元測試設計的。

public class MyServiceTest {
    @Test
    public void testDoSomething() {
        MyRepository mockRepository = mock(MyRepository.class);
        MyService myService = new MyService(mockRepository);

        // 測試邏輯
    }
}

看見沒?

直接傳入 mock 對象,測試簡單、優雅。

總結

簡單總結下問題:

  1. 隱式依賴讓代碼可讀性差。
  2. 強耦合違背面向接口編程。
  3. 字段注入容易 NPE。
  4. 自動裝配有坑。
  5. 單元測試不好寫。

那到底咋辦?用 構造函數注入,清晰、穩健、測試友好,官方推薦不是沒道理的。

但話說回來,@Autowired 也不是不能用,只是你得分場景。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2022-09-26 10:26:27

FieldIDEASpring

2023-09-27 23:03:01

Java虛擬線程

2024-11-12 10:30:54

Docker部署數據庫

2024-06-04 00:10:00

開發拷貝

2025-05-16 02:00:00

HashMapJava代碼

2024-09-12 08:32:42

2023-11-06 13:04:59

Python日志庫

2021-08-23 13:02:50

MySQLJOIN數據庫

2022-01-11 10:29:32

Docker文件掛載

2025-04-29 07:06:20

2021-07-04 14:19:03

RabbitMQ消息轉換

2018-11-29 14:30:42

數據庫外鍵約束應用程序

2021-01-13 09:55:29

try-catch-fJava代碼

2020-08-31 11:20:53

MySQLuuidid

2024-03-11 11:02:03

Date類JavaAPI

2020-07-02 14:12:52

C++語言編程

2020-10-19 11:05:17

SpringTransaction事務

2024-07-29 09:03:00

2023-09-07 17:06:21

@Autowired報錯原因分析

2025-02-24 10:36:15

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲图片视频一区 | 欧美日韩在线综合 | 成人黄色三级毛片 | 日韩中字幕 | 一级欧美视频 | 99一级毛片| 97av| 国内精品一区二区 | 国产精品99一区二区 | 欧美日韩成人在线观看 | 欧美性一区二区三区 | h在线 | 日本精品裸体写真集在线观看 | 国产日韩欧美在线观看 | 日韩毛片 | 久久成人精品 | 国产精品久久久免费 | 在线免费亚洲视频 | 亚洲一区在线观看视频 | 国产精品一卡二卡三卡 | 999久久久| 一级毛片在线播放 | 99re6在线视频精品免费 | 色综合99| 国产精品视频一区二区三区不卡 | 国产原创视频 | 日本在线看 | 亚洲精品在线免费 | 99久久久无码国产精品 | 久久亚| 亚洲视频在线观看 | 国产精品久久久久久久免费大片 | 天天综合网天天综合 | 特级生活片| 国产精品日韩 | 中文字幕精品视频在线观看 | 日本成人免费观看 | 日韩在线播放网址 | 在线观看亚洲 | 精品视频在线播放 | 国产中文视频 |