靜態(tài)工具類中注入Bean及引用Nacos配置方式
1.說明
在代碼開發(fā)中,經(jīng)常會存在調(diào)用第三方工具或者其他系統(tǒng)的場景,通常封裝成一個工具類供service進(jìn)行調(diào)用,便于后期的維護(hù)及代碼復(fù)用。
工具類中的屬性及方法都被static修飾,在工具類中不能使用和service中一樣的注入Bean及引用Nacos值的方式。
不能給靜態(tài)變量注入Bean的原因
Spring從源碼層面不提供對static修飾的變量進(jìn)行注入,靜態(tài)變量不屬于任何一個實例,而是屬于類的。
當(dāng)類加載器加載靜態(tài)變量時,Spring的上下文環(huán)境還沒有被加載。
這是因為初始化類的加載升序?qū)е碌模绦騿訒r會加載根路徑下所有的類,不管這個類是否會用到都會去加載;會先初始化靜態(tài)變量和執(zhí)行靜態(tài)代碼塊,這時候無法創(chuàng)建對象,而@autowired是要注入一個對象。
2.示例
@Component
public class BpmUtils {
private static RestTemplate restTemplate;
private static LogTool logTool;
@Autowired
public void setRestTemplate(RestTemplate restTemplate) {
BpmUtils.restTemplate = restTemplate;
}
@Autowired
public void setLogTool(LogTool logTool) {
BpmUtils.logTool = logTool;
}
// 權(quán)限用戶名
private static String accessKey;
// 權(quán)限密碼
private static String secret;
// 系統(tǒng)用戶
private static String userCode;
// tokenUrl
private static String tokenUrl;
// 部門url
private static String deptUrl;
// 用戶url
private static String userUrl;
@NacosValue(value = "${bpm.accessKey}", autoRefreshed = true)
public void setAccessKey(String accessKey) {
BpmUtils.accessKey = accessKey;
}
@NacosValue(value = "${bpm.secret}", autoRefreshed = true)
public void setSecret(String secret) {
BpmUtils.secret = secret;
}
@NacosValue(value = "${bpm.userCode}", autoRefreshed = true)
public void setUserCode(String userCode) {
BpmUtils.userCode = userCode;
}
@NacosValue(value = "${bpm.tokenUrl}", autoRefreshed = true)
public void setTokenUrl(String tokenUrl) {
BpmUtils.tokenUrl = tokenUrl;
}
@NacosValue(value = "${bpm.deptUrl}", autoRefreshed = true)
public void setDeptUrl(String deptUrl) {
BpmUtils.deptUrl = deptUrl;
}
@NacosValue(value = "${bpm.userUrl}", autoRefreshed = true)
public void setUserUrl(String userUrl) {
BpmUtils.userUrl = userUrl;
}
}①bean的注入方式
可以通過構(gòu)造器進(jìn)行注入,或者通過setter方法進(jìn)行注入。注意要在類上添加@Component注解,標(biāo)記為一個bean,這樣spring容器會掃描到。
我上面采用的是setter方法注入,將容器中已有的bean設(shè)置到靜態(tài)變量中。
也可以使用構(gòu)造器注入的方式
@Autowired
public TestClass(AutowiredTypeComponent component) {
TestClass.component = component;
}
②Nacos中配置的注入方式
通過setter方法進(jìn)行注入,在setter方法上添加nacos注解,獲取配置的值,將值設(shè)置到靜態(tài)變量中。
3.補充
在實際開發(fā)中,我們也可以不使用靜態(tài)工具類的方式,可以通過注解方式創(chuàng)建一個bean,在bean內(nèi)直接注入nacos中的屬性,并寫一些方法,實際使用時,可以直接注入bean,然后進(jìn)行使用。
使用靜態(tài)工具類的方式,無需注入,可以直接使用。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- springboot如何讀取配置文件到靜態(tài)工具類
- java靜態(tài)工具類注入service出現(xiàn)NullPointerException異常處理
- SpringMVC高效獲取JavaBean對象指南
- 淺析如何使用xstream實現(xiàn)javaBean與xml互轉(zhuǎn)
- 在Java中使用ModelMapper簡化Shapefile屬性轉(zhuǎn)JavaBean實戰(zhàn)過程
- 使用MapStruct進(jìn)行Java Bean映射的方式
- Java?json轉(zhuǎn)換實體類(JavaBean)及實體類(JavaBean)轉(zhuǎn)換json代碼示例
相關(guān)文章
Java的volatile和sychronized底層實現(xiàn)原理解析
文章詳細(xì)介紹了Java中的synchronized和volatile關(guān)鍵字的底層實現(xiàn)原理,包括字節(jié)碼層面、JVM層面的實現(xiàn)細(xì)節(jié),以及鎖的類型和MESI協(xié)議在多核處理器中的作用,文章還探討了synchronized和volatile的區(qū)別,以及如何通過Atomic類來實現(xiàn)更細(xì)粒度的原子操作,感興趣的朋友一起看看吧2025-03-03
Mybatis中SqlSession接口中selectList方法詳解
這篇文章主要給大家介紹了關(guān)于Mybatis中SqlSession接口中selectList方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-03-03
springboot配置Jackson返回統(tǒng)一默認(rèn)值的實現(xiàn)示例
在項目開發(fā)中,我們返回的數(shù)據(jù)或者對象沒有的時候一般直接返回的null,那么如何返回統(tǒng)一默認(rèn)值,感興趣的可以了解一下2021-07-07
IDEA?報Plugin'maven-resources-plugin:'not?found?
如果在使用?IDEA?時遇到?"Plugin?'maven-resources-plugin:'?not?found"?錯誤,可能是由于?Maven?倉庫中未找到所需的?Maven?插件,近小編給大家分享幾種解決方法,感興趣的朋友跟隨小編一起看看吧2023-07-07
Java使用分布式實現(xiàn)數(shù)據(jù)庫讀寫分離的示例代碼
在MySQL中可以通過配置主從復(fù)制來實現(xiàn)數(shù)據(jù)同步,本文主要介紹了Java使用分布式實現(xiàn)數(shù)據(jù)庫讀寫分離,具有一定的參考價值,感興趣的可以了解一下2024-07-07
Spring中的兩種代理JDK和CGLIB的區(qū)別淺談
本篇文章中主要介紹了Spring中的兩種代理JDK和CGLIB的區(qū)別淺談,詳解的介紹了JDK和CGLIB的原理和方法,有需要的朋友可以了解一下2017-04-04

