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

面試突擊:Spring 依賴注入有幾種?各有什么優(yōu)缺點?

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

IoC 和 DI 是 Spring 中最重要的兩個概念,其中 IoC(Inversion of Control)為控制反轉的思想,而 DI(Dependency Injection)依賴注入為其(IoC)具體實現(xiàn)。那么 DI 實現(xiàn)依賴注入的方式有幾種?這些注入方式又有什么不同?接下來,我們一起來看。

1.概述

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

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

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

2.屬性注入

屬性注入是我們最熟悉,也是日常開發(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 容器;

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

接下來我們一一來看。

缺點1:功能性問題

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

圖片

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

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

缺點2:通用性問題

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

缺點3:設計原則問題

使用屬性注入的方式,因為使用起來很簡單,所以開發(fā)者很容易在一個類中同時注入多個對象,而這些對象的注入是否有必要?是否符合程序設計中的單一職責原則?就變成了一個問題。但可以肯定的是,注入實現(xiàn)越簡單,那么濫用它的概率也越大,所以出現(xiàn)違背單一職責原則的概率也越大。注意:這里強調的是違背設計原則(單一職責)的可能性,而不是一定會違背設計原則,二者有著本質的區(qū)別。

3.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)點的話,那么首當其沖的就是它完全符合單一職責的設計原則,因為每一個 Setter 只針對一個對象。但它的缺點也很明顯,它的缺點主要體現(xiàn)在以下 2 點:

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

  • 注入的對象可被修改。
  • 接下來我們一一來看。

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

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

圖片

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

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

4.構造方法注入

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

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

優(yōu)點分析

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

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

接下來我們一一來看。

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

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

圖片

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

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

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

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

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

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

總結

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

參考 & 鳴謝

Spring 官方文檔

責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2021-09-09 13:53:08

區(qū)塊鏈加密貨幣技術

2022-09-19 06:16:23

事務隔離級別Spring

2022-04-11 07:40:45

synchroniz靜態(tài)方法程序

2018-07-20 15:25:02

2022-05-23 07:35:15

單例模式懶漢模式靜態(tài)內部類

2022-04-18 07:36:37

TimeUnit線程休眠

2025-05-14 00:00:00

MySQL雙主架構循環(huán)復制

2023-12-14 08:13:56

2022-05-05 07:38:32

volatilJava并發(fā)

2022-08-22 07:06:32

MyBatisSQL占位符

2022-02-04 23:26:56

iOS系統(tǒng)蘋果

2022-08-17 07:06:14

SpringBoot配置@Value

2022-03-07 07:33:16

線程池Java語言

2022-08-03 07:04:56

GETHTTPPOST

2022-04-26 08:02:00

locktryLocklockInterr

2022-08-10 07:06:57

IoCDISpring

2022-04-24 07:59:53

synchronizJVMAPI

2022-02-08 07:02:32

進程線程操作系統(tǒng)

2022-08-15 07:06:50

Propertiesyml配置

2011-05-31 10:00:21

Android Spring 依賴注入
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚州激情| 成人一区二区在线 | 久久婷婷麻豆国产91天堂 | 免费视频久久久久 | 黄网站免费观看 | 精品国产久 | 日韩欧美一区二区三区免费观看 | 国产亚洲精品久久午夜玫瑰园 | 久久久久国产 | 久久国产欧美日韩精品 | aacc678成免费人电影网站 | 夜夜草| 国产成人免费视频网站视频社区 | 在线成人 | 2019天天干天天操 | 欧美精品国产一区二区 | 粉嫩一区二区三区四区公司1 | 国产综合精品一区二区三区 | 亚洲成av片人久久久 | 成人片免费看 | 欧美一区二区免费 | 欧美三区在线观看 | 国产特黄一级 | 欧美综合国产精品久久丁香 | 亚洲一二三区不卡 | 在线国产小视频 | 日韩精品一区二区久久 | 日韩一二三区 | 午夜寂寞影院在线观看 | 国产精品亚洲一区二区三区在线观看 | 国产三级 | 九九综合九九 | 亚洲精品一区二区三区在线 | 国产日韩欧美一区 | 久久香蕉网 | 久久免费看 | 亚洲一区二区综合 | 亚洲97| 成在线人视频免费视频 | 午夜视频在线 | 欧美日韩中文字幕 |