1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        為什么IDEA不推薦你使用@Autowired ?

        共 3431字,需瀏覽 7分鐘

         ·

        2021-11-09 16:36

        @Autowired注解相信每個Spring開發(fā)者都不陌生了!在DD的Spring Boot基礎(chǔ)教程https://blog.didispace.com/spring-boot-learning-2x/Spring Cloud基礎(chǔ)教程(https://blog.didispace.com/spring-cloud-learning/)中也都經(jīng)常會出現(xiàn)。

        但是當(dāng)我們使用IDEA寫代碼的時候,經(jīng)常會發(fā)現(xiàn)@Autowired注解下面是有小黃線的,我們把小鼠標(biāo)懸停在上面,可以看到這個如下圖所示的警告信息:

        那為什么IDEA會給出Field injection is not recommended這樣的警告呢?

        下面帶著這樣的問題,一起來全面的了解下Spring中的三種注入方式以及他們之間在各方面的優(yōu)劣。

        Spring中的三種依賴注入方式

        Field Injection

        @Autowired注解的一大使用場景就是Field Injection。

        具體形式如下:

        @Controller
        public class UserController {

            @Autowired
            private UserService userService;

        }

        這種注入方式通過Java的反射機制實現(xiàn),所以private的成員也可以被注入具體的對象。

        Constructor Injection

        Constructor Injection是構(gòu)造器注入,是我們?nèi)粘W顬橥扑]的一種使用方式。

        具體形式如下:

        @Controller
        public class UserController {

            private final UserService userService;

            public UserController(UserService userService){
                this.userService = userService;
            }

        }

        這種注入方式很直接,通過對象構(gòu)建的時候建立關(guān)系,所以這種方式對對象創(chuàng)建的順序會有要求,當(dāng)然Spring會為你搞定這樣的先后順序,除非你出現(xiàn)循環(huán)依賴,然后就會拋出異常。

        Setter Injection

        Setter Injection也會用到@Autowired注解,但使用方式與Field Injection有所不同,Field Injection是用在成員變量上,而Setter Injection的時候,是用在成員變量的Setter函數(shù)上。

        具體形式如下:

        @Controller
        public class UserController {

            private UserService userService;

            @Autowired
            public void setUserService(UserService userService){
                this.userService = userService;
            }
        }

        這種注入方式也很好理解,就是通過調(diào)用成員變量的set方法來注入想要使用的依賴對象。

        三種依賴注入的對比

        在知道了Spring提供的三種依賴注入方式之后,我們繼續(xù)回到本文開頭說到的問題:IDEA為什么不推薦使用Field Injection呢?

        我們可以從多個開發(fā)測試的考察角度來對比一下它們之間的優(yōu)劣:

        可靠性

        從對象構(gòu)建過程和使用過程,看對象在各階段的使用是否可靠來評判:

        • Field Injection:不可靠
        • Constructor Injection:可靠
        • Setter Injection:不可靠

        由于構(gòu)造函數(shù)有嚴(yán)格的構(gòu)建順序和不可變性,一旦構(gòu)建就可用,且不會被更改。

        可維護性

        主要從更容易閱讀、分析依賴關(guān)系的角度來評判:

        • Field Injection:差
        • Constructor Injection:好
        • Setter Injection:差

        還是由于依賴關(guān)鍵的明確,從構(gòu)造函數(shù)中可以顯現(xiàn)的分析出依賴關(guān)系,對于我們?nèi)绾稳プx懂關(guān)系和維護關(guān)系更友好。

        可測試性

        當(dāng)在復(fù)雜依賴關(guān)系的情況下,考察程序是否更容易編寫單元測試來評判

        • Field Injection:差
        • Constructor Injection:好
        • Setter Injection:好

        Constructor InjectionSetter Injection的方式更容易Mock和注入對象,所以更容易實現(xiàn)單元測試。

        靈活性

        主要根據(jù)開發(fā)實現(xiàn)時候的編碼靈活性來判斷:

        • Field Injection:很靈活
        • Constructor Injection:不靈活
        • Setter Injection:很靈活

        由于Constructor Injection對Bean的依賴關(guān)系設(shè)計有嚴(yán)格的順序要求,所以這種注入方式不太靈活。相反Field InjectionSetter Injection就非常靈活,但也因為靈活帶來了局面的混亂,也是一把雙刃劍。

        循環(huán)關(guān)系的檢測

        對于Bean之間是否存在循環(huán)依賴關(guān)系的檢測能力:

        • Field Injection:不檢測
        • Constructor Injection:自動檢測
        • Setter Injection:不檢測

        性能表現(xiàn)

        不同的注入方式,對性能的影響

        • Field Injection:啟動快
        • Constructor Injection:啟動慢
        • Setter Injection:啟動快

        主要影響就是啟動時間,由于Constructor Injection有嚴(yán)格的順序要求,所以會拉長啟動時間。

        所以,綜合上面各方面的比較,可以獲得如下表格:

        結(jié)果一目了然,Constructor Injection在很多方面都是優(yōu)于其他兩種方式的,所以Constructor Injection通常都是首選方案!

        Setter Injection比起Field Injection來說,大部分都一樣,但因為可測試性更好,所以當(dāng)你要用@Autowired的時候,推薦使用Setter Injection的方式,這樣IDEA也不會給出警告了。同時,也側(cè)面反映了,可測試性的重要地位?。?/span>

        總結(jié)

        最后,對于今天的問題討論,我們給出兩個結(jié)論,方便大家記憶:

        1. 依賴注入的使用上,Constructor Injection是首選。
        2. 使用@Autowired注解的時候,要使用Setter Injection方式,這樣代碼更容易編寫單元測試。
        好了,今天的學(xué)習(xí)就到這里!如果您學(xué)習(xí)過程中如遇困難?可以加入我們超高質(zhì)量的Spring技術(shù)交流群,參與交流與討論,更好的學(xué)習(xí)與進步!只需要點擊下方卡片,回復(fù)“加群,即可加入我們的高質(zhì)量技術(shù)交流群

        往期推薦

        GitHub高贊,一款足以取代迅雷的開源下載工具

        ElasticSearch近實時搜索的實現(xiàn)

        炸裂!跑P站上教微積分,年入170w...

        SpringBoot + Mybatis Plus + ClickHouse增刪改查入門教程

        GitHub Copilot 支持 IntelliJ IDEA啦,插件裝起來!


        PS:因為公眾號平臺更改了推送規(guī)則,如果不想錯過內(nèi)容,記得讀完點一下“在看”,加個“星標(biāo)”,這樣每次新文章推送才會第一時間出現(xiàn)在你的訂閱列表里。
        瀏覽 45
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            18禁免费看男女污污污完整版网站 | 正在播放白峰美羽无码 | 青青草在线视频免费观看 | 欧美自拍日韩专区第一页 | 大美女操逼 | 欧美日逼| 做爱免费视频网站 | 变态另类在线 | 亚洲精品一区二区三区婷婷月 | 中文字幕永久有效 |