中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring依賴注入的方式及優缺點是什么

發布時間:2022-08-24 10:27:41 來源:億速云 閱讀:154 作者:iii 欄目:開發技術

本篇內容介紹了“Spring依賴注入的方式及優缺點是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    0.概述

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

    • 屬性注入(Field Injection);

    • Setter 注入(Setter Injection);

    • 構造方法注入(Constructor Injection)。

    它們的具體使用和優缺點分析如下。

    1.屬性注入

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

    @RestController
    public class UserController {
        // 屬性對象
        @Autowired
        private UserService userService;
    
        @RequestMapping("/add")
        public UserInfo add(String username, String password) {
            return userService.add(username, password);
        }
    }

    1.1 優點分析

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

    1.2 缺點分析

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

    Spring依賴注入的方式及優缺點是什么

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

    • 功能性問題:無法注入一個不可變的對象(final 修飾的對象);

    • 通用性問題:只能適應于 IoC 容器;

    • 設計原則問題:更容易違背單一設計原則。

    接下來我們一一來看。

    缺點1:功能性問題

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

    Spring依賴注入的方式及優缺點是什么

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

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

    缺點2:通用性問題

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

    缺點3:設計原則問題

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

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

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

    2.Setter 注入

    Setter 注入的實現代碼如下:

    @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);
        }
    }

    優缺點分析

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

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

    但它的缺點也很明顯,它的缺點主要體現在以下 2 點:

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

    • 注入的對象可被修改。

    接下來我們一一來看。

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

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

    Spring依賴注入的方式及優缺點是什么

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

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

    3.構造方法注入

    構造方法注入是 Spring 官方從 4.x 之后推薦的注入方式,它的實現代碼如下:

    @RestController
    public class UserController {
        // 構造方法注入
        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);
        }
    }

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

    @RestController
    public class UserController {
        // 構造方法注入
        private UserService userService;
    
        public UserController(UserService userService) {
            this.userService = userService;
        }
    
        @RequestMapping("/add")
        public UserInfo add(String username, String password) {
            return userService.add(username, password);
        }
    }

    優點分析

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

    • 可注入不可變對象;

    • 注入對象不會被修改;

    • 注入對象會被完全初始化;

    • 通用性更好。

    接下來我們一一來看。

    優點1:注入不可變對象

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

    Spring依賴注入的方式及優缺點是什么

    優點2:注入對象不會被修改

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

    優點3:完全初始化

    因為依賴對象是在構造方法中執行的,而構造方法是在對象創建之初執行的,因此被注入的對象在使用之前,會被完全初始化,這也是構造方法注入的優點之一。

    優點4:通用性更好

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

    “Spring依賴注入的方式及優缺點是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    金乡县| 溧水县| 陆丰市| 顺平县| 吴川市| 永平县| 乃东县| 蒙自县| 桂东县| 巨鹿县| 南开区| 赤水市| 嘉善县| 贵阳市| 绥化市| 瓦房店市| 体育| 泗水县| 岑溪市| 子洲县| 长治县| 陆河县| 自贡市| 玉树县| 昌黎县| 桐乡市| 濉溪县| 上高县| 桓台县| 柘荣县| 金湖县| 宁国市| 佛教| 师宗县| 若尔盖县| 鄂州市| 庐江县| 策勒县| 清丰县| 漾濞| 漳平市|