最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring依賴注入的三種方式以及優(yōu)缺點

 更新時間:2022年08月24日 08:59:30   作者:Java中文社群  
IoC?和?DI?是?Spring?中最重要的兩個概念,其中?IoC(Inversion?of?Control)為控制反轉(zhuǎn)的思想,而?DI(Dependency?Injection)依賴注入為其(IoC)具體實現(xiàn)。那么?DI?實現(xiàn)依賴注入的方式有幾種?這些注入方式又有什么不同?本文就來和大家一起詳細聊聊

0.概述

在 Spring 中實現(xiàn)依賴注入的常見方式有以下 3 種:

  • 屬性注入(Field Injection);
  • Setter 注入(Setter Injection);
  • 構(gòu)造方法注入(Constructor Injection)。

它們的具體使用和優(yōu)缺點分析如下。

1.屬性注入

屬性注入是我們最熟悉,也是日常開發(fā)中使用最多的一種注入方式,它的實現(xiàn)代碼如下:

@RestController
public class UserController {
    // 屬性對象
    @Autowired
    private UserService userService;

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

1.1 優(yōu)點分析

屬性注入最大的優(yōu)點就是實現(xiàn)簡單、使用簡單,只需要給變量上添加一個注解(@Autowired),就可以在不 new 對象的情況下,直接獲得注入的對象了(這就是 DI 的功能和魅力所在),所以它的優(yōu)點就是使用簡單。

1.2 缺點分析

然而,屬性注入雖然使用簡單,但也存在著很多問題,甚至編譯器 Idea 都會提醒你“不建議使用此注入方式”,Idea 的提示信息如下:

屬性注入的缺點主要包含以下 3 個:

  • 功能性問題:無法注入一個不可變的對象(final 修飾的對象);
  • 通用性問題:只能適應于 IoC 容器;
  • 設(shè)計原則問題:更容易違背單一設(shè)計原則。

接下來我們一一來看。

缺點1:功能性問題

使用屬性注入無法注入一個不可變的對象(final 修飾的對象),如下圖所示:

原因也很簡單:在 Java 中 final 對象(不可變)要么直接賦值,要么在構(gòu)造方法中賦值,所以當使用屬性注入 final 對象時,它不符合 Java 中 final 的使用規(guī)范,所以就不能注入成功了。

PS:如果要注入一個不可變的對象,要怎么實現(xiàn)呢?使用下面的構(gòu)造方法注入即可。

缺點2:通用性問題

使用屬性注入的方式只適用于 IoC 框架(容器),如果將屬性注入的代碼移植到其他非 IoC 的框架中,那么代碼就無效了,所以屬性注入的通用性不是很好。

缺點3:設(shè)計原則問題

使用屬性注入的方式,因為使用起來很簡單,所以開發(fā)者很容易在一個類中同時注入多個對象,而這些對象的注入是否有必要?是否符合程序設(shè)計中的單一職責原則?就變成了一個問題。

但可以肯定的是,注入實現(xiàn)越簡單,那么濫用它的概率也越大,所以出現(xiàn)違背單一職責原則的概率也越大

注意:這里強調(diào)的是違背設(shè)計原則(單一職責)的可能性,而不是一定會違背設(shè)計原則,二者有著本質(zhì)的區(qū)別。

2.Setter 注入

Setter 注入的實現(xiàn)代碼如下:

@RestController
public class UserController {
    // Setter 注入
    private UserService userService;

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

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

優(yōu)缺點分析

從上面代碼可以看出,Setter 注入比屬性注入要麻煩很多。

要說 Setter 注入有什么優(yōu)點的話,那么首當其沖的就是它完全符合單一職責的設(shè)計原則,因為每一個 Setter 只針對一個對象。

但它的缺點也很明顯,它的缺點主要體現(xiàn)在以下 2 點:

  • 不能注入不可變對象(final 修飾的對象);
  • 注入的對象可被修改。

接下來我們一一來看。

缺點1:不能注入不可變對象

使用 Setter 注入依然不能注入不可變對象,比如以下注入會報錯:

缺點2:注入對象可被修改

Setter 注入提供了 setXXX 的方法,意味著你可以在任何時候、在任何地方,通過調(diào)用 setXXX 的方法來改變注入對象,所以 Setter 注入的問題是,被注入的對象可能隨時被修改。

3.構(gòu)造方法注入

構(gòu)造方法注入是 Spring 官方從 4.x 之后推薦的注入方式,它的實現(xiàn)代碼如下:

@RestController
public class UserController {
    // 構(gòu)造方法注入
    private UserService userService;

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

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

當然,如果當前的類中只有一個構(gòu)造方法,那么 @Autowired 也可以省略,所以以上代碼還可以這樣寫:

@RestController
public class UserController {
    // 構(gòu)造方法注入
    private UserService userService;

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

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

優(yōu)點分析

構(gòu)造方法注入相比于前兩種注入方法,它可以注入不可變對象,并且它只會執(zhí)行一次,也不存在像 Setter 注入那樣,被注入的對象隨時被修改的情況,它的優(yōu)點有以下 4 個:

  • 可注入不可變對象;
  • 注入對象不會被修改;
  • 注入對象會被完全初始化;
  • 通用性更好。

接下來我們一一來看。

優(yōu)點1:注入不可變對象

使用構(gòu)造方法注入可以注入不可變對象,如下代碼所示:

優(yōu)點2:注入對象不會被修改

構(gòu)造方法注入不會像 Setter 注入那樣,構(gòu)造方法在對象創(chuàng)建時只會執(zhí)行一次,因此它不存在注入對象被隨時(調(diào)用)修改的情況。

優(yōu)點3:完全初始化

因為依賴對象是在構(gòu)造方法中執(zhí)行的,而構(gòu)造方法是在對象創(chuàng)建之初執(zhí)行的,因此被注入的對象在使用之前,會被完全初始化,這也是構(gòu)造方法注入的優(yōu)點之一。

優(yōu)點4:通用性更好

構(gòu)造方法和屬性注入不同,構(gòu)造方法注入可適用于任何環(huán)境,無論是 IoC 框架還是非 IoC 框架,構(gòu)造方法注入的代碼都是通用的,所以它的通用性更好。

總結(jié)

依賴注入的常見實現(xiàn)方式有 3 種:屬性注入、Setter 注入和構(gòu)造方法注入。其中屬性注入的寫法最簡單,所以日常項目中使用的頻率最高,但它的通用性不好;而 Spring 官方推薦的是構(gòu)造方法注入,它可以注入不可變對象,其通用性也更好,如果是注入可變對象,那么可以考慮使用 Setter 注入。

以上就是詳解Spring依賴注入的三種方式以及優(yōu)缺點的詳細內(nèi)容,更多關(guān)于Spring依賴注入的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Javaweb項目session超時解決方案

    Javaweb項目session超時解決方案

    這篇文章主要介紹了Javaweb項目session超時解決方案,關(guān)于解決方案分類比較明確,內(nèi)容詳細,需要的朋友可以參考下。
    2017-09-09
  • java實現(xiàn)肯德基收銀系統(tǒng)

    java實現(xiàn)肯德基收銀系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)肯德基收銀系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • java反射機制實戰(zhàn)示例分享

    java反射機制實戰(zhàn)示例分享

    這篇文章主要介紹了java反射機制實戰(zhàn)示例,需要的朋友可以參考下
    2014-03-03
  • Java HttpURLConnection使用方法詳解

    Java HttpURLConnection使用方法詳解

    這篇文章主要為大家詳細介紹了Java HttpURLConnection使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java利用redis實現(xiàn)防止接口重復提交

    Java利用redis實現(xiàn)防止接口重復提交

    本文主要為大家詳細介紹了Java如何利用redis實現(xiàn)防止接口重復提交,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • YGC前后新生代是否變大分析詳解

    YGC前后新生代是否變大分析詳解

    要解釋這個問題,我們先要弄清楚YGC的過程,parNew是新生代的gc算法,簡單來說從gc roots開始掃描對象,當掃到一個只要是屬于新生代的對象就將其挪到to space,但是老的對象還不會做釋放,直到gc完成之后再看是否釋放老的對象
    2022-01-01
  • 解決java.util.NoSuchElementException異常正確方法

    解決java.util.NoSuchElementException異常正確方法

    java.util.NoSuchElementException是Java中的一種異常,表示在迭代器或枚舉中找不到元素,這篇文章主要給大家介紹了關(guān)于解決java.util.NoSuchElementException異常的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)時間和字符串互轉(zhuǎn)

    Java實現(xiàn)時間和字符串互轉(zhuǎn)

    這篇文章主要為大家詳細介紹了如何通過Java實現(xiàn)時間對象和字符串互相轉(zhuǎn)換,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-10-10
  • SpringBoot如何根據(jù)目錄路徑生成接口的url路徑

    SpringBoot如何根據(jù)目錄路徑生成接口的url路徑

    這篇文章主要介紹了SpringBoot如何根據(jù)目錄路徑生成接口的url路徑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 詳解Java兩種方式簡單實現(xiàn):爬取網(wǎng)頁并且保存

    詳解Java兩種方式簡單實現(xiàn):爬取網(wǎng)頁并且保存

    本篇文章主要介紹了Java兩種方式簡單實現(xiàn):爬取網(wǎng)頁并且保存 ,主要用UrlConnection、HttpClient爬取實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12

最新評論

右玉县| 青岛市| 永济市| 清河县| 得荣县| 岑巩县| 武威市| 建昌县| 三都| 柳河县| 商城县| 鹿邑县| 富裕县| 河东区| 龙山县| 乾安县| 奉节县| 阿坝县| 家居| 石景山区| 怀来县| 莒南县| 神木县| 来凤县| 西和县| 怀安县| 黑龙江省| 华宁县| 介休市| 太原市| 靖宇县| 屏南县| 龙州县| 利川市| 怀宁县| 达州市| 永靖县| 石渠县| 松溪县| 玉田县| 拉孜县|