在平常的開發中,我們會為一些功能進行一些自定義引數的配置或者增加一些開關,配置的方式有很多,今天我們就來討論一些@value引數注入
@value("$")
private boolean b;
通常情況下,我們會這樣對乙個引數進行屬性值注入,冒號後面的是給定的預設值,防止我們在配置檔案中忘記配置專案啟動報錯,這樣是沒有問題的,然後我們在配置檔案中加入如下配置
configure:
custom: false
上面的例項是沒有問題的,接下來我們看看引數什麼情況下注入為null
1.屬性用static修飾,如下:
@value("$")
private static boolean b;
為什麼加入了static修飾符之後我們獲取到的b為null呢,我們首先要了解下依賴注入的目的,spring依賴注入是基於物件層面的依賴注入,的目的是產生乙個物件的例項,然後在整個生命週期中去使用,類變數,靜態變數它不屬於物件屬性,屬於類屬性,一旦使用的靜態屬性或者方法,就不需要再產生這個類的例項以後去使用,,同時你也不能為乙個給定的類,依靠注入方式去產生多個具有不同的依賴環境的例項,使用靜態變數/類變數擴大了靜態方法的使用範圍.靜態方法在spring是不推薦使用的。
從原始碼中我們也可以看到,在判斷當前要注入的屬性為static時,直接列印一句日誌,然後返回;
reflectionutils.dowithlocalfields(targetclass, new reflectionutils.fieldcallback()
return;
}boolean required = determinerequiredstatus(ann);
currelements.add(new autowiredfieldelement(field, required));}}
});
我們在啟動日誌中也可以看到:
當然,針對這中靜態注入也有解決辦法,我們可以在setter方法上面進行注入,但是需要注意的是,我們的setter方法不能為靜態的
private static boolean b;
@value("$")
public void setb(boolean b)
順帶說說類和物件的區別:
類是乙個靜態的概念,類本身不攜帶任何資料。當沒有為類建立任何物件時,類本身不存在於記憶體空間中。
物件是乙個動態的概念。每乙個物件都存在著有別於其它物件的屬於自己的獨特的屬性和行為。物件的屬性可以隨著它自己的行為而發生改變
類是物件的模板,物件是類的例項。類只有通過物件才可以使用,而在開發之中應該先產生類,之後再產生物件。類不能直接使用,物件是可以直接使用
2.類沒有加上@component(或者@service等)
如果我們在使用@value的類上面沒有加一些spring容器初始化時要掃瞄的註解,那麼它是無法為當前物件的屬性進行注入的
3.new新建了例項,如下:
@component
class test")
private boolean b;
}class test2
我們雖然在test類中對屬性b進行了注入,但是我們在test2類中使用的時候又建立的新的例項,相當於我們重新建立了乙個空的test物件,所以,無法獲取原先的屬性值,這個很好理解,如果我們需要使用,可以利用@autowired註解進行注 Value注入static屬性
1.給引數注入,執行set方法 public class sendmessagecenter public void setmessage string message value public void setpage string page 在set方法上面新增註解的,一定要在class上新增 ...
Value注入static屬性
1.給引數注入,執行set方法 component public class sendmessagecenter public void setmessage string message value public void setpage string page 在set方法上面新增註解的,一定要...
Value無法注入static屬性
使用 value直接放在static的屬性上是無法注入內容的 此方式會一直是null.發現 value不能直接注入值給靜態屬性,spring 不允許 不支援把值注入到靜態變數中 spring支援set方法注入,我們可以利用非靜態setter 方法注入靜態變數,並且使用 value的類必須交個spri...