靜態(tài)工具類中注入Bean及引用Nacos配置方式
1.說明
在代碼開發(fā)中,經(jīng)常會存在調(diào)用第三方工具或者其他系統(tǒng)的場景,通常封裝成一個工具類供service進行調(diào)用,便于后期的維護及代碼復(fù)用。
工具類中的屬性及方法都被static修飾,在工具類中不能使用和service中一樣的注入Bean及引用Nacos值的方式。
不能給靜態(tài)變量注入Bean的原因
Spring從源碼層面不提供對static修飾的變量進行注入,靜態(tài)變量不屬于任何一個實例,而是屬于類的。
當類加載器加載靜態(tài)變量時,Spring的上下文環(huán)境還沒有被加載。
這是因為初始化類的加載升序?qū)е碌?,程序啟動時會加載根路徑下所有的類,不管這個類是否會用到都會去加載;會先初始化靜態(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)造器進行注入,或者通過setter方法進行注入。注意要在類上添加@Component注解,標記為一個bean,這樣spring容器會掃描到。
我上面采用的是setter方法注入,將容器中已有的bean設(shè)置到靜態(tài)變量中。
也可以使用構(gòu)造器注入的方式
@Autowired
public TestClass(AutowiredTypeComponent component) {
TestClass.component = component;
}
②Nacos中配置的注入方式
通過setter方法進行注入,在setter方法上添加nacos注解,獲取配置的值,將值設(shè)置到靜態(tài)變量中。
3.補充
在實際開發(fā)中,我們也可以不使用靜態(tài)工具類的方式,可以通過注解方式創(chuàng)建一個bean,在bean內(nèi)直接注入nacos中的屬性,并寫一些方法,實際使用時,可以直接注入bean,然后進行使用。
使用靜態(tài)工具類的方式,無需注入,可以直接使用。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring框架開發(fā)IOC兩種創(chuàng)建工廠方法詳解
這篇文章主要介紹了Spring框架IOC兩種創(chuàng)建工廠方法詳解,文中附含詳細的代碼示例分別對靜態(tài)方法和實例方法創(chuàng)建工廠作了簡要的分析2021-09-09
IntelliJ IDEA之配置JDK的4種方式(小結(jié))
這篇文章主要介紹了IntelliJ IDEA之配置JDK的4種方式(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
IntelliJ IDEA中如何調(diào)試Java Stream操作
這篇文章主要介紹了IntelliJ IDEA中如何優(yōu)雅的調(diào)試Java Stream操作,在強大的IDEA插件支持下,stream的調(diào)試其實也沒那么難了,下面就來學(xué)習(xí)一下在IDEA中如何調(diào)試stream操作吧2022-05-05
Spring?createBeanInstance實例化Bean
這篇文章主要為大家介紹了Spring?createBeanInstance實例化Bean源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
Spring學(xué)習(xí)之開發(fā)環(huán)境搭建的詳細步驟
本篇文章主要介紹了Spring學(xué)習(xí)之開發(fā)環(huán)境搭建的詳細步驟,具有一定的參考價值,有興趣的可以了解一下2017-07-07
springboot如何接收application/x-www-form-urlencoded類型的請求
這篇文章主要介紹了springboot如何接收application/x-www-form-urlencoded類型的請求,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

