日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中

發(fā)布時間:2025/3/17 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在spring工程中,我們經(jīng)常需要使用到配置文件的一些信息,在每個類中定義,可能導致這些信息變得零散。spring給我們提供了一個注解@Value(),使我們可以注入配置文件中的數(shù)據(jù)。

bootstrap.yml

jay:

key: www.baidu.com

如果你想在你的工具類中注入這個變量,那么你可能面臨問題,方法是static的,那么你需要使用靜態(tài)變量作為參數(shù)在方法中使用。

錯誤示范:

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)變量中了.

為什么會出現(xiàn)空指針?

先說結(jié)論: Spring從源碼層面不提供對static修飾符的成員變量進行注入.

AutowiredAnnotationBeanPostProcessor#buildAutowiringMetadata

/**

* 解析當前Class被@Autowired標記的成員

* @param clazz

* @return

*/

private InjectionMetadata buildAutowiringMetadata(final Class> clazz) {

List elements = new ArrayList<>();

Class> targetClass = clazz;

// 遞歸遍歷當前類及其所有基類,解析全部注解元信息

do {

final List currElements = new ArrayList<>();

// 收集被@Autowired、@Value標記的Field.

// 利用反射機制獲取給定類中所有的聲明字段,獲取字段上的注解信息

// doWithLocalFields->獲取當前類的所有Field,每個field執(zhí)行l(wèi)ambda內(nèi)的邏輯.

ReflectionUtils.doWithLocalFields(targetClass, field -> {

// 此處邏輯較為復雜,通過debug發(fā)現(xiàn)如果為被標注的屬性,會返回required:true.

// 大致的意思是這個field是否被特定的注解標記?這里留一個疑問

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);

// 將當前成員添加進currElements

currElements.add(new AutowiredFieldElement(field, required));

}

});

// 省略....

}

static的變量是歸屬于Class的,而Spring容器上下文只對Java對象進行管理,Spring不鼓勵對static變量做注入Bean的操作,因此如果需要在某些工具類中將Bean賦值給靜態(tài)變量,可以使用構(gòu)造注入的方式. 或者使用@PostConstruct作為橋梁.

想深入的朋友可以看看這篇文章: 想用@Autowired注入static靜態(tài)成員?官方不推薦你卻還偏要這么做

總結(jié)

以上是生活随笔為你收集整理的Java静态变量注入配置值,工具类使用@Value将信息注入到静态变量中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。