欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

引言

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

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

Spring的三種注入方式

屬性(filed)注入

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

@Autowired 
UserDao userDao;

構(gòu)造器注入

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

final
UserDao userDao;

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

set方法注入

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

private UserDao userDao;

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

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

問題一

基于 field 的注入可能會帶來一些隱含的問題。來我們舉個例子:

@Autowired
private User user;

private String company;

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

編譯過程不會報錯,但是運行之后報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 在初始化一個類時,是按照靜態(tài)變量或靜態(tài)語句塊 –> 實例變量或初始化語句塊 –> 構(gòu)造方法 -> @Autowired 的順序。所以在執(zhí)行這個類的構(gòu)造方法時,user對象尚未被注入,它的值還是 null。

問題二

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

問題三

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

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.

翻譯過來就是:

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

使用@Resource代替@Autowired

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Java中byte、byte數(shù)組與int、long的轉(zhuǎn)換詳解

    Java中byte、byte數(shù)組與int、long的轉(zhuǎn)換詳解

    這篇文章分別給大家介紹了Java中byte和int之間的轉(zhuǎn)換、Java中 byte數(shù)組和int之間的轉(zhuǎn)換、Java中byte數(shù)組和long之間的轉(zhuǎn)換以及整理了整體工具類的源碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • Java實現(xiàn)的打地鼠小游戲完整示例【附源碼下載】

    Java實現(xiàn)的打地鼠小游戲完整示例【附源碼下載】

    這篇文章主要介紹了Java實現(xiàn)的打地鼠小游戲,結(jié)合完整實例形式分析了Java多線程操作及鍵盤按鍵響應(yīng)實現(xiàn)的打地鼠游戲功能相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • springmvc整合freemarker配置的詳細(xì)步驟

    springmvc整合freemarker配置的詳細(xì)步驟

    本篇文章主要介紹了springmvc整合freemarker的詳細(xì)步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringMVC 上傳文件 MultipartFile 轉(zhuǎn)為 File的方法

    SpringMVC 上傳文件 MultipartFile 轉(zhuǎn)為 File的方法

    這篇文章主要介紹了SpringMVC 上傳文件 MultipartFile 轉(zhuǎn)為 File的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • springboot使用GuavaCache做簡單緩存處理的方法

    springboot使用GuavaCache做簡單緩存處理的方法

    這篇文章主要介紹了springboot使用GuavaCache做簡單緩存處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • servlet實現(xiàn)文件下載的步驟及說明詳解

    servlet實現(xiàn)文件下載的步驟及說明詳解

    這篇文章主要為大家詳細(xì)介紹了servlet實現(xiàn)文件下載的步驟及說明,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • java的多線程高并發(fā)詳解

    java的多線程高并發(fā)詳解

    這篇文章主要介紹了java的多線程高并發(fā)詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • Java內(nèi)存映射 大文件輕松處理

    Java內(nèi)存映射 大文件輕松處理

    這篇文章主要介紹了Java內(nèi)存映射 大文件輕松處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Java for循環(huán)的妙用之雞兔同籠問題

    Java for循環(huán)的妙用之雞兔同籠問題

    這篇文章主要給大家介紹了關(guān)于Java for循環(huán)的妙用之雞兔同籠問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java中super和this的用法詳解

    Java中super和this的用法詳解

    這篇文章主要介紹了Java中super和this的用法詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論