如何基於Autowired對建構函式進行注釋

2022-09-26 19:21:15 字數 2078 閱讀 6044

在編寫**的時候,使用@autowired註解是,發現ide報的乙個警告,如下:

spring team recommends "always use constructor based dependency injection in your beans. always use assertions for mandatory dependencies".

翻譯:spring建議」總是在您的bean中使用建構函式建立依賴注入。總是使用斷言強制依賴」。

這段**警告原來的寫法是:

@autowired

private enterprisedbservice service;

建議後寫成下面的樣子:

private final enterprisedbservice service;

@autowired

public enterprisedbcontroller(enterprisedbservice service)

奇怪,為何會有這樣的建議。

我們知道:@autowired 可以對成員變數、方法以及建構函式進行注釋。那麼對成員變數和建構函式進行注釋又有什麼區別呢?

@autowired注入bean,相當於在配置檔案中配置bean,並且使用setter注入。而對構造函程式設計客棧數進行注釋,就相當於是使用建構函式進行依賴注入了吧。莫非是這兩種注入方法的不同。

以下是:@autowired和構造方法執行的順序解析

先看一段**,下面的**能執行成功嗎?

@autowired

private user user;

private string school;

public useraccountserviceimpl()

答案是不能。

因為j**a類會先執行構造方法,然後再給註解了@autowired 的user注入值,所以在執行構造方法的時候,就會報錯。

報錯資訊可能會像下面:

exception in thread "main"程式設計客棧 org.springframework.beans.factory.beancreationexception: error creating bean with name '...' defined in file [....class]: instantiation of bean failed; nested exception is org.spzzuzpwslringframework.beans.beaninstantiationexception: failed to instantiate [...]: constructor threw exception; nested exception is j**a.lang.nullpointerexception

報錯資訊說:建立bean時出錯,出錯原因是例項化bean失敗,因為bean時構造方法出錯,在構造方法裡丟擲了空指標異常。

解決辦法是,使用構造器注入,如下:

private user user;

private string school;

@autowired

public useraccountserviceimpl(user user)

可以看出,使用構造器注入的方法,可以明確成員變數的載入順序。

ps:j**a變數的初始化順序為:靜態變數或靜態語句塊–>例項變數或初始化語句塊–>構造方法–>@autowired

那麼最開始spring建議,為何要將成員變數加上final型別呢?

網上有解釋如下:spring配置預設的bean的scope是singleton,也就是啟動後一直有。通過設定bean的scope屬性為prototype來宣告該物件為動態建立。但是,如果你的service本身是singleton,注入只執行一次。

@autowired本身就是單例模式,只會在程式啟動時執行一次,即使不定義final也不會初始化第二次,所以這個final是沒有意義的吧。程式設計客棧

可能是為了防止,在程式執行的時候,又執行了一遍建構函式;

或者是更容易讓人理解的意思,加上final只會在程式啟動的時候初始化一次,並且在程式執行的時候不會再改變。

不過這種寫法,我還是蠻喜歡的!

本文標題: 如何基於autowired對建構函式進行注釋

本文位址:

基於 Webhooks gitlab 自動化構建

基於gitlab webhooks 自動構建流程 1 伺服器安裝 git 服務 安裝成功 配置 php 指令碼 接受頭部資訊 if isset get youparam if get youparam qiuxue666 接受引數 datas file get contents php input ...

座標串如何構面

當前gis技術高速發展,各種技術方法應運而生,解決問題的方法多種多樣。就當前自己遇到的問題,總結如下 針對礦業權座標串成圖 構面 問題,其1個專案的座標串中可能存在1或多個圖塊座標 主區 挖空區 且有標識 1代表主區,0代表挖空區 但不排除主區 挖空區標識寫錯的 未做標識的 圖形繪製方向搞反的,所以...

C 對析構函式的誤解

析構函式在什麼時候會自動被呼叫,在什麼時候需要手動來呼叫,真不好意思說偶學過c 今日特此撥亂反正 物件在構造的時候系統會分配記憶體資源,對一些資料成員進行初始化或者賦值 乙個良好的class需要有資源 的機制,而這一操作便落在了析構函式的頭上,析構函式來負責類內的資源的free。來看一段 class...