Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中
在spring工程中,我們經(jīng)常需要使用到配置文件的一些信息,在每個(gè)類中定義,可能導(dǎo)致這些信息變得零散。spring給我們提供了一個(gè)注解@Value(),使我們可以注入配置文件中的數(shù)據(jù)。
bootstrap.yml
jay:
key: www.baidu.com
如果你想在你的工具類中注入這個(gè)變量,那么你可能面臨問題,方法是static的,那么你需要使用靜態(tài)變量作為參數(shù)在方法中使用。
錯(cuò)誤示范:
public class testUtils{
@Value("${jay.key}")
private static String url;
}
正確示范
@Configuration
public class testUtils{
private static String url;
@Value("${jay.key}")
public void setUrl(String url) {
url= url;
}
}
通過@Component和在Setter上打上注解,即可將配置文件的信息注入到靜態(tài)變量中了.
為什么會(huì)出現(xiàn)空指針?
先說結(jié)論: Spring從源碼層面不提供對(duì)static修飾符的成員變量進(jìn)行注入.
AutowiredAnnotationBeanPostProcessor#buildAutowiringMetadata
/**
* 解析當(dāng)前Class被@Autowired標(biāo)記的成員
* @param clazz
* @return
*/
private InjectionMetadata buildAutowiringMetadata(final Class> clazz) {
List elements = new ArrayList<>();
Class> targetClass = clazz;
// 遞歸遍歷當(dāng)前類及其所有基類,解析全部注解元信息
do {
final List currElements = new ArrayList<>();
// 收集被@Autowired、@Value標(biāo)記的Field.
// 利用反射機(jī)制獲取給定類中所有的聲明字段,獲取字段上的注解信息
// doWithLocalFields->獲取當(dāng)前類的所有Field,每個(gè)field執(zhí)行l(wèi)ambda內(nèi)的邏輯.
ReflectionUtils.doWithLocalFields(targetClass, field -> {
// 此處邏輯較為復(fù)雜,通過debug發(fā)現(xiàn)如果為被標(biāo)注的屬性,會(huì)返回required:true.
// 大致的意思是這個(gè)field是否被特定的注解標(biāo)記?這里留一個(gè)疑問
AnnotationAttributes ann = findAutowiredAnnotation(field);
if (ann != null) {
// 如果是static屬性的成員,Spring不提供支持
if (Modifier.isStatic(field.getModifiers())) {
if (logger.isInfoEnabled()) {
logger.info("Autowired annotation is not supported on static fields: " + field);
}
return;
}
// 判斷required的狀態(tài)
boolean required = determineRequiredStatus(ann);
// 將當(dāng)前成員添加進(jìn)currElements
currElements.add(new AutowiredFieldElement(field, required));
}
});
// 省略....
}
static的變量是歸屬于Class的,而Spring容器上下文只對(duì)Java對(duì)象進(jìn)行管理,Spring不鼓勵(lì)對(duì)static變量做注入Bean的操作,因此如果需要在某些工具類中將Bean賦值給靜態(tài)變量,可以使用構(gòu)造注入的方式. 或者使用@PostConstruct作為橋梁.
想深入的朋友可以看看這篇文章: 想用@Autowired注入static靜態(tài)成員?官方不推薦你卻還偏要這么做
總結(jié)
以上是生活随笔為你收集整理的Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android获取年月日时分秒毫秒,An
- 下一篇: 为什么vsdebug没有生成obj文件_