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

Spring為什么不推薦使用@Autowired注解詳析

 更新時(shí)間:2021年11月03日 11:57:21   作者:Mr泰迪  
@Autowired 注解的主要功能就是完成自動(dòng)注入,使用也非常簡(jiǎn)單,但這篇文章主要給大家介紹了關(guān)于Spring為什么不推薦使用@Autowired注解的相關(guān)資料,需要的朋友可以參考下

引言

使用IDEA開(kāi)發(fā)時(shí),同組小伙伴都喜歡用@Autowired注入,代碼一片warning,看著很不舒服,@Autowired作為Spring的親兒子,為啥在IDEA中提示了一個(gè)警告:Field injection is not recommended

想搞清楚這個(gè)問(wèn)題之前,首先先了解一下依賴注入的幾種方式

Spring的三種注入方式

屬性(filed)注入

這種注入方式就是在bean的變量上使用注解進(jìn)行依賴注入。本質(zhì)上是通過(guò)反射的方式直接注入到field。這是我平常開(kāi)發(fā)中看的最多也是最熟悉的一種方式。

@Autowired 
UserDao userDao;

構(gòu)造器注入

將各個(gè)必需的依賴全部放在帶有注解構(gòu)造方法的參數(shù)中,并在構(gòu)造方法中完成對(duì)應(yīng)變量的初始化,這種方式,就是基于構(gòu)造方法的注入。比如:

final
UserDao userDao;

@Autowired
public UserServiceImpl(UserDao userDao) {
    this.userDao = userDao;
}

set方法注入

通過(guò)對(duì)應(yīng)變量的setXXX()方法以及在方法上面使用注解,來(lái)完成依賴注入。比如:

private UserDao userDao;

@Autowired
public void setUserDao (UserDao userDao) {
    this.userDao = userDao;
}

屬性注入可能出現(xiàn)的問(wèn)題

問(wèn)題一

基于 field 的注入可能會(huì)帶來(lái)一些隱含的問(wèn)題。來(lái)我們舉個(gè)例子:

@Autowired
private User user;

private String company;

public UserDaoImpl(){
    this.company = user.getCompany();
}

編譯過(guò)程不會(huì)報(bào)錯(cuò),但是運(yùn)行之后報(bào)NullPointerException

Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [...]: Constructor threw exception; nested exception is java.lang.NullPointerException

Java 在初始化一個(gè)類(lèi)時(shí),是按照靜態(tài)變量或靜態(tài)語(yǔ)句塊 –> 實(shí)例變量或初始化語(yǔ)句塊 –> 構(gòu)造方法 -> @Autowired 的順序。所以在執(zhí)行這個(gè)類(lèi)的構(gòu)造方法時(shí),user對(duì)象尚未被注入,它的值還是 null。

問(wèn)題二

不能有效的指明依賴。相信很多人都遇見(jiàn)過(guò)一個(gè)bug,依賴注入的對(duì)象為null,在啟動(dòng)依賴容器時(shí)遇到這個(gè)問(wèn)題都是配置的依賴注入少了一個(gè)注解什么的。這種方式就過(guò)于依賴注入容器了,當(dāng)沒(méi)有啟動(dòng)整個(gè)依賴容器時(shí),這個(gè)類(lèi)就不能運(yùn)轉(zhuǎn),在反射時(shí)無(wú)法提供這個(gè)類(lèi)需要的依賴。

問(wèn)題三

依賴注入的核心思想之一就是被容器管理的類(lèi)不應(yīng)該依賴被容器管理的依賴,換成白話來(lái)說(shuō)就是如果這個(gè)類(lèi)使用了依賴注入的類(lèi),那么這個(gè)類(lèi)擺脫了這幾個(gè)依賴必須也能正常運(yùn)行。然而使用變量注入的方式是不能保證這點(diǎn)的。

spring建議

Since you can mix constructor-based and setter-based DI, it is a good rule of thumb to use constructors for mandatory dependencies and setter methods or configuration methods for optional dependencies.

翻譯過(guò)來(lái)就是:

強(qiáng)制依賴就用構(gòu)造器方式
可選、可變的依賴就用setter注入

使用@Resource代替@Autowired

@Resource有2個(gè)屬性name和type。在spring中name屬性定義為bean的名字,type這是bean的類(lèi)型。如果屬性上加@Resource注解那么他的注入流程是

  • 如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常。
  • 如果指定了name,則從上下文中查找名稱匹配的bean進(jìn)行裝配,找不到則拋出異常。
  • 如果指定了type,則從上下文中找到類(lèi)型匹配的唯一bean進(jìn)行裝配,找不到或是找到多個(gè),都會(huì)拋出異常。
  • 如果既沒(méi)有指定name,又沒(méi)有指定type,則默認(rèn)按照byName方式進(jìn)行裝配;如果沒(méi)有匹配,按照byType進(jìn)行裝配。

@Autowired只根據(jù)type進(jìn)行注入,不會(huì)去匹配name。如果涉及到type無(wú)法辨別注入對(duì)象時(shí),那需要依賴@Qualifier或@Primary注解一起來(lái)修飾。

使用@RequiredArgsConstructor構(gòu)造器方式注入

這種形式就是Spring推薦使用的構(gòu)造器方式注入,此種方式是lombok包下的注解,如果使用此種方式,需要項(xiàng)目中引入lombok,例如:

@RequiredArgsConstructor
public class UserDaoImpl{
	private final User user;
}

總結(jié)

到此這篇關(guān)于Spring為什么不推薦使用@Autowired注解的文章就介紹到這了,更多相關(guān)Spring使用@Autowired注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

衡南县| 博客| 南郑县| 高雄县| 繁峙县| 新建县| 鞍山市| 郴州市| 合水县| 永川市| 乌恰县| 新宁县| 蒙自县| 苏州市| 增城市| 贵阳市| 华坪县| 车险| 嘉善县| 黄平县| 遵义市| 芦山县| 乌鲁木齐市| 巢湖市| 东海县| 洞口县| 泾源县| 盐津县| 金坛市| 共和县| 宁强县| 铜山县| 金塔县| 内乡县| 牙克石市| 阿拉善右旗| 邻水| 彰武县| 石狮市| 保山市| 庄浪县|