0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Lombok版的構(gòu)造器注入方式

科技綠洲 ? 來源:了不起 ? 作者:了不起 ? 2023-09-25 10:50 ? 次閱讀

做開發(fā)的同學(xué)可能都會(huì)發(fā)現(xiàn), IDEA 在我們經(jīng)常使用的@Autowired注解上添加了警告: Field injection is not recommended, 即: 不推薦使用屬性注入。那怎么解決這個(gè)問題呢?


問題原因

違背單一職責(zé)原則

因?yàn)楝F(xiàn)在的業(yè)務(wù)一般都會(huì)使用很多依賴, 但擁有太多的依賴通常意味著承擔(dān)更多的責(zé)任,而這顯然違背了單一職責(zé)原則。

依賴Spring

@Autowired由 Spring 提供,而@Resource是JSR-250提供的,它是Java標(biāo)準(zhǔn)。前者會(huì)警告,而后者不警告,就是因?yàn)榍罢邔?dǎo)致了應(yīng)用與框架的強(qiáng)綁定,若是換成其他IOC框架,則不能夠成功注入了。其實(shí)對(duì)于這方面,我認(rèn)為在大多數(shù)情況時(shí)是不會(huì)有什么問題的。

其他

我看到網(wǎng)絡(luò)上有一些其他方面的總結(jié),比如:因?yàn)槭?ByType 注入, 因此有可能會(huì)出現(xiàn)兩個(gè)相同的類型bean,進(jìn)而導(dǎo)致Spring裝配失?。徊荒芟駱?gòu)造器那樣注入不可變的對(duì)象等,這類問題需要結(jié)合個(gè)人實(shí)際開發(fā)進(jìn)行判斷。

對(duì)于@Autowired使用方面,它雖然是將業(yè)務(wù)代碼和框架進(jìn)行了強(qiáng)綁定,但字段注入確實(shí)大幅簡化了代碼。能夠有效提高代碼簡潔性,讓依賴注入的事情交給IOC容器,省時(shí)省力,這也是它的優(yōu)點(diǎn),我們應(yīng)該在實(shí)際使用中追求平衡,否則將為了過度追求松耦合而得不償失。

其他注入方法

除了使用@Autowired以外,我們其實(shí)也有幾種好用的方式。使用@Resource替代@Autiwired方法是其中一種,只需要改變一個(gè)注解,這里就不展示了。

Setter注入

能夠通過懶加載的方式解決循環(huán)依賴,類中的依賴在需要用到的時(shí)候才會(huì)注入。另外,setter注入方式很靈活,注入的對(duì)象還能改變。

@RestController
public class DemoController {

    private DemoService demoService;

    /*
     * 基于set注入
     * */
    @Autowired
    public void setDemoService(DemoService demoService) {
        this.demoService = demoService;
    }

}

這種方法也使用了@Autowired注解,但是它是作用于成員變量的Setter函數(shù)上,而不是像Field注入一樣作用于成員變量上。

這是三種注入方式中最靈活的,這個(gè)靈活就是它的缺點(diǎn)。Setter注入的依賴不能保證依賴不可變。

構(gòu)造器

@RestController
public class DemoController {

    private DemoService demoService;

    /*
    * 基于構(gòu)造方法的注入
    * */
    public DemoController(DemoService demoService) {
        this.demoService = demoService;
    }
}

它的好處在于,采用了構(gòu)造方法注入,這種方式對(duì)對(duì)象創(chuàng)建的順序會(huì)有要求,它將避免循環(huán)依賴問題。是最可靠的方法。

但其也有缺點(diǎn),假如類中需要注入的依賴比較多,就會(huì)顯得構(gòu)造方法很臃腫,缺乏可讀性。另外,構(gòu)造器注入不能解決循環(huán)依賴問題。

構(gòu)造器簡化版(推薦)

首先,需要引入lombok依賴。

< dependency >
    < groupId >org.projectlombok< /groupId >
    < artifactId >lombok< /artifactId >
< /dependency >

隨后,我們?cè)趧?chuàng)建時(shí)就可以使用@RequiredArgsConstructor注解,它將幫我們創(chuàng)建構(gòu)造器,注意,屬性必須添加 final 關(guān)鍵字。

@RestController
@RequiredArgsConstructor
public class DemoController {
    /*
     * 用@RequiredArgsConstructor注解,這個(gè)使用方式也可以應(yīng)用于service層
     * */
    private final DemoService demoService;

}

通過查看編譯結(jié)果,發(fā)現(xiàn)Lombok自動(dòng)生成了構(gòu)造方法,非常簡便。

總結(jié)

最不推薦使用的是 屬性注入 ,除了省力以外沒有好處。

Setter注入構(gòu)造器注入 各有優(yōu)劣,需要根據(jù)實(shí)際情況選擇。

最推薦使用 Lombok版的構(gòu)造器注入 方式,既簡單又可靠。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104477
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    398

    瀏覽量

    17404
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68229
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    338

    瀏覽量

    14295
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ADC的規(guī)則通道和注入通道混合使用(轉(zhuǎn))

    DMA 請(qǐng)求,并將轉(zhuǎn)換的數(shù)據(jù)從 ADC_DR 寄存傳輸?shù)接脩糁付ǖ哪康牡刂?,還有注入方式轉(zhuǎn)換后數(shù)據(jù)存儲(chǔ)到 ADC_DRJx寄存和規(guī)則方式
    發(fā)表于 01-19 10:40

    給AVR 單片機(jī)構(gòu)造移位寄存方式的輸出函數(shù)

    給AVR 單片機(jī)構(gòu)造移位寄存方式的輸出函數(shù)
    發(fā)表于 05-14 15:07 ?37次下載

    小巧的信號(hào)注入

    小巧的信號(hào)注入
    發(fā)表于 04-20 11:35 ?597次閱讀
    小巧的信號(hào)<b class='flag-5'>注入</b><b class='flag-5'>器</b>

    S注入法與電壓互感的特殊接線方式

    S注入法與電壓互感的特殊接線方式 摘 要:基于“S注入法”的選線定位保護(hù)新原理的TY系列選線定位保護(hù)已大量運(yùn)行于國內(nèi)電
    發(fā)表于 07-11 16:02 ?925次閱讀
    S<b class='flag-5'>注入</b>法與電壓互感<b class='flag-5'>器</b>的特殊接線<b class='flag-5'>方式</b>

    “S注入法”與電壓互感的特殊接線方式

    “S注入法”與電壓互感的特殊接線方式 基于“S注入法”的選線定位保護(hù)新原理的TY系列選線定位保護(hù)已大量運(yùn)行于國內(nèi)電力系統(tǒng)?!癝注入法”需
    發(fā)表于 07-23 09:39 ?1939次閱讀
    “S<b class='flag-5'>注入</b>法”與電壓互感<b class='flag-5'>器</b>的特殊接線<b class='flag-5'>方式</b>

    Lombok開發(fā)插件使用小技巧

    0x01:Lombok簡介 Lombok 是一款 Java開發(fā)插件,使得 Java 開發(fā)者可以通過其定義的一些注解來消除業(yè)務(wù)工程中冗長和繁瑣的代碼,尤其對(duì)于簡單的 Java 模型對(duì)象(POJO)。在
    的頭像 發(fā)表于 06-12 18:07 ?1741次閱讀

    重演自己如何掉入Lombok的戲法陷阱

    ? https://www.ramostear.com/blog/2020/04/28/uk1860p8.html ? 如果您正在閱讀此文,想必您對(duì)Project Lombok已經(jīng)有了一段時(shí)間的了解
    的頭像 發(fā)表于 10-28 11:29 ?1173次閱讀

    Lombok同時(shí)使用@Data和@Builder的一個(gè)必須要避開的巨坑

    構(gòu)造報(bào)錯(cuò)!編譯不通過。如下圖: Lombok @Data和@Builder分別單獨(dú)分析用法 Lombok使?@Data可以?成?參構(gòu)造和類
    的頭像 發(fā)表于 10-11 18:14 ?1922次閱讀

    AC/DC的基礎(chǔ):變壓方式和開關(guān)方式的比較

    前文已針對(duì)采用變壓方式和開關(guān)方式AC/DC轉(zhuǎn)換,概略說明一下AC/DC轉(zhuǎn)換的工作狀況和電路,在此則是比較兩者,并整理各自的優(yōu)缺點(diǎn)。如果比較電路構(gòu)造,會(huì)發(fā)現(xiàn)因轉(zhuǎn)換
    發(fā)表于 02-15 16:12 ?675次閱讀
    AC/DC的基礎(chǔ):變壓<b class='flag-5'>器</b><b class='flag-5'>方式</b>和開關(guān)<b class='flag-5'>方式</b>的比較

    探討Spring框架中的屬性注入技術(shù)

    在本文中,我們深入探討了 Spring 框架中的屬性注入技術(shù),包括 setter 注入構(gòu)造注入、注解式屬性
    的頭像 發(fā)表于 06-14 09:37 ?892次閱讀
    探討Spring框架中的屬性<b class='flag-5'>注入</b>技術(shù)

    Lombok的使用

    在平時(shí)我們工作的時(shí)候,我們經(jīng)常會(huì)使用 toString() 方法來輸出一個(gè)對(duì)象的一些屬性信息。Lombok 給我們提供了一個(gè)自動(dòng)生成 toString() 代碼的注解,可以減少代碼行數(shù),如果代碼屬性
    的頭像 發(fā)表于 09-25 14:03 ?743次閱讀

    Lombok如何派上用場(chǎng)

    Java的 record 關(guān)鍵字是Java 14中引入的一個(gè)新的語義特性。record 對(duì)于創(chuàng)建小型不可變的對(duì)象非常有用。另一方面,Lombok 是一個(gè)Java庫,可以自動(dòng)生成一些已知的模式為
    的頭像 發(fā)表于 10-08 15:39 ?279次閱讀

    什么是SQL注入?Java項(xiàng)目防止SQL注入方式

    Java項(xiàng)目防止SQL注入方式 這里總結(jié)4種: PreparedStatement防止SQL注入 mybatis中#{}防止SQL注入 對(duì)請(qǐng)求參數(shù)的敏感詞匯進(jìn)行過濾 ngin
    發(fā)表于 10-16 14:26 ?521次閱讀

    Spring依賴注入方式

    可維護(hù)性和可測(cè)試性。同時(shí),Spring 提供了多種依賴注入方式,以滿足不同場(chǎng)景下的需求。本文將詳細(xì)介紹 Spring 依賴注入方式構(gòu)造
    的頭像 發(fā)表于 11-22 15:12 ?443次閱讀

    Spring中依賴注入的四種方式

    詳細(xì)介紹四種常見的依賴注入方式。 第一種方式構(gòu)造函數(shù)注入構(gòu)造函數(shù)
    的頭像 發(fā)表于 12-03 15:11 ?1825次閱讀