Autowire 警告的原因

2021-10-18 07:35:09 字數 2827 閱讀 3581

今天使用idea寫**的時候,看到之前的專案中顯示有warning的提示,去看了下,是如下**?

@autowire

private jdbctemplate jdbctemplate;

提示的警告資訊

field injection is not recommended inspection info: spring team recommends: "always use constructor based dependency injection in your beans. always use assertions for mandatory dependencies".

這段是spring工作組的建議,大致翻譯一下:

如圖

field注入警告

雖然當前有關spring framework(5.0.3)的文件僅定義了兩種主要的注入型別,但實際上有三種:

基於建構函式的依賴注入

public class userserviceimpl implents userservice

}

基於setter的依賴注入

public class userserviceimpl implents userservice

}

基於欄位的依賴注入

public class userserviceimpl implents userservice
基於欄位的依賴注入方式會在idea當中吃到黃牌警告,但是這種使用方式使用的也最廣泛,因為簡潔方便.您甚至可以在一些spring指南中看到這種注入方法,儘管在文件中不建議這樣做.(有點執法犯法的感覺)

spring註解:超級全面的 springboot 註解介紹

如圖

spring自己的文件

對於有final修飾的變數不好使

spring的ioc對待屬性的注入使用的是set形式,但是final型別的變數在呼叫class的建構函式的這個過程當中就得初始化完成,這個是基於欄位的依賴注入做不到的地方.只能使用基於建構函式的依賴注入的方式

掩蓋單一職責的設計思想

我們都知道在oop的設計當中有乙個單一職責思想,如果你採用的是基於建構函式的依賴注入的方式來使用spring的ioc的時候,當你注入的太多的時候,這個構造方法的引數就會很龐大,類似於下面.

當你看到這個類的構造方法那麼多引數的時候,你自然而然的會想一下:這個類是不是違反了單一職責思想?.但是使用基於欄位的依賴注入不會讓你察覺,你會很沉浸在@autowire當中

public class verifyserviceimpl implents verifyservice

}

與spring的ioc機制緊密耦合當你使用基於欄位的依賴注入方式的時候,確實可以省略構造方法和setter這些個模板型別的方法,但是,你把控制權全給spring的ioc了,別的類想重新設定下你的某個注入屬性,沒法處理(當然反射可以做到).

本身spring的目的就是解藕和依賴反轉,結果通過再次與類注入器(在本例中為spring)耦合,失去了通過自動裝配類字段而實現的對類的解耦,從而使類在spring容器之外無效.

隱藏依賴性

當你使用spring的ioc的時候,被注入的類應當使用一些public型別(構造方法,和setter型別方法)的方法來向外界表達:我需要什麼依賴.但是基於欄位的依賴注入的方式,基本都是private形式的,private把屬性都給封印到class當中了.

無法對注入的屬性進行安檢

基於欄位的依賴注入方式,你在程式啟動的時候無法拿到這個類,只有在真正的業務使用的時候才會拿到,一般情況下,這個注入的都是非null的,萬一要是null怎麼辦,在業務處理的時候錯誤才爆出來,時間有點晚了,如果在啟動的時候就暴露出來,那麼bug就可以很快得到修復(當然你可以加註解校驗).

如果你想在屬性注入的時候,想根據這個注入的物件操作點東西,你無法辦到.我碰到過的例子:一些配置資訊啊,有些人總是會配錯誤,等到了自己測試業務階段才知道配錯了,例如執行緒初始個數不小心配置成了3000,機器真的是狂叫啊!這個時候就需要再某些value注入的時候做乙個檢測機制.

通過上面,我們可以看到,基於欄位的依賴注入方式有很多缺點,我們應當避免使用基於欄位的依賴注入.推薦的方法是使用基於建構函式基於setter的依賴注入.對於必需的依賴項,建議使用基於建構函式的注入,以使它們成為不可變的,並防止它們為null。對於可選的依賴項,建議使用基於setter的注入

分析表示式警告的原因

erlang的表示式如果不用的話,會警告的,但是有些又不警告,比較奇怪,做了下試驗,再看了compiler的原始碼有了以下的結果 root yufeng desktop nl expr.erl 1 module expr 2 export test 0 3 test 4 1,5 1.0,6 7 1,...

spring中autowire的用法

autowire模式就是在spring的宣告檔案裡用作進行物件間的關聯關係自動繫結的,就是在spring beanfactory內的乙個bean對其bean的引用可以自動進行,而不一定用ref 的方式顯式宣告。在reference的3.3.6節有詳細的介紹,autowire主要有5種模式 1 no ...

spring中autowire的用法

autowire模式就是在spring的宣告檔案裡用作進行物件間的關聯關係自動繫結的,就是在spring beanfactory內的乙個bean對其bean的引用可以自動進行,而不一定用ref 的方式顯式宣告。在reference的3.3.6節有詳細的介紹,autowire主要有5種模式 1 no ...