日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
面試突擊:Spring依賴(lài)注入有幾種?各有什么優(yōu)缺點(diǎn)?

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

汝城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,汝城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為汝城上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的汝城做網(wǎng)站的公司定做!

1.概述

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

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

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

2.屬性注入

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

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

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

1.1 優(yōu)點(diǎn)分析

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

1.2 缺點(diǎn)分析

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

屬性注入的缺點(diǎn)主要包含以下 3 個(gè):

功能性問(wèn)題:無(wú)法注入一個(gè)不可變的對(duì)象(final 修飾的對(duì)象);

通用性問(wèn)題:只能適應(yīng)于 IoC 容器;

設(shè)計(jì)原則問(wèn)題:更容易違背單一設(shè)計(jì)原則。

接下來(lái)我們一一來(lái)看。

缺點(diǎn)1:功能性問(wèn)題

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

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

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

缺點(diǎn)2:通用性問(wèn)題

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

缺點(diǎn)3:設(shè)計(jì)原則問(wèn)題

使用屬性注入的方式,因?yàn)槭褂闷饋?lái)很簡(jiǎn)單,所以開(kāi)發(fā)者很容易在一個(gè)類(lèi)中同時(shí)注入多個(gè)對(duì)象,而這些對(duì)象的注入是否有必要?是否符合程序設(shè)計(jì)中的單一職責(zé)原則?就變成了一個(gè)問(wèn)題。但可以肯定的是,注入實(shí)現(xiàn)越簡(jiǎn)單,那么濫用它的概率也越大,所以出現(xiàn)違背單一職責(zé)原則的概率也越大。注意:這里強(qiáng)調(diào)的是違背設(shè)計(jì)原則(單一職責(zé))的可能性,而不是一定會(huì)違背設(shè)計(jì)原則,二者有著本質(zhì)的區(qū)別。

3.Setter 注入

Setter 注入的實(shí)現(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)缺點(diǎn)分析

從上面代碼可以看出,Setter 注入比屬性注入要麻煩很多。要說(shuō) Setter 注入有什么優(yōu)點(diǎn)的話,那么首當(dāng)其沖的就是它完全符合單一職責(zé)的設(shè)計(jì)原則,因?yàn)槊恳粋€(gè) Setter 只針對(duì)一個(gè)對(duì)象。但它的缺點(diǎn)也很明顯,它的缺點(diǎn)主要體現(xiàn)在以下 2 點(diǎn):

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

  • 注入的對(duì)象可被修改。
  • 接下來(lái)我們一一來(lái)看。

缺點(diǎn)1:不能注入不可變對(duì)象

使用 Setter 注入依然不能注入不可變對(duì)象,比如以下注入會(huì)報(bào)錯(cuò):

缺點(diǎn)2:注入對(duì)象可被修改

Setter 注入提供了 setXXX 的方法,意味著你可以在任何時(shí)候、在任何地方,通過(guò)調(diào)用 setXXX 的方法來(lái)改變注入對(duì)象,所以 Setter 注入的問(wèn)題是,被注入的對(duì)象可能隨時(shí)被修改。

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

構(gòu)造方法注入是 Spring 官方從 4.x 之后推薦的注入方式,它的實(shí)現(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);
}
}

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

@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)點(diǎn)分析

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

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

接下來(lái)我們一一來(lái)看。

優(yōu)點(diǎn)1:注入不可變對(duì)象

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

優(yōu)點(diǎn)2:注入對(duì)象不會(huì)被修改

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

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

因?yàn)橐蕾?lài)對(duì)象是在構(gòu)造方法中執(zhí)行的,而構(gòu)造方法是在對(duì)象創(chuàng)建之初執(zhí)行的,因此被注入的對(duì)象在使用之前,會(huì)被完全初始化,這也是構(gòu)造方法注入的優(yōu)點(diǎn)之一。

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

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

總結(jié)

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

參考 & 鳴謝

Spring 官方文檔


分享題目:面試突擊:Spring依賴(lài)注入有幾種?各有什么優(yōu)缺點(diǎn)?
鏈接URL:http://www.5511xx.com/article/cdojhgc.html