




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Spring對(duì)靜態(tài)變量無法注入的解決方案beanid="JDBCUtils"init-method="init"
propertyname="dataSource"ref="dataSource"/property
/bean
靜態(tài)方法注入bean失敗原因
今天在寫redission的一個(gè)工具類的時(shí)候,隨手寫出下面的代碼
packagecom.wt.redission.wtredission.utils;
importorg.redisson.api.*;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importjavax.annotation.PostConstruct;
@Component
publicclassRedissionUtilserror{
@Autowired
privatestaticRedissonClientredissonClient;
publicstaticRLockgetRLock(StringobjectName){
RLockrLock=redissonClient.getLock(objectName);
returnrLock;
//根據(jù)名字獲取map
publicstaticK,VRMapK,VgetRMap(StringobjectName){
RMapK,Vmap=redissonClient.getMap(objectName);
returnmap;
//根據(jù)名字和值設(shè)置map
publicstaticvoidsetMap(StringobjectName,Objectkey,Objectvalue){
RMapObject,Objectmap=redissonClient.getMap(objectName);
map.put(key,value);
//根據(jù)名字獲取set
publicstaticVRSetVgetSet(StringobjectName){
RSetVset=redissonClient.getSet(objectName);
returnset;
//根據(jù)名字和值設(shè)置set
publicstaticvoidsetSet(StringobjectName,Objectvalue){
RSetObjectset=redissonClient.getSet(objectName);
set.add(value);
//根據(jù)名字獲取list
publicstaticVRListVgetRList(StringobjectName){
RListVrList=redissonClient.getList(objectName);
returnrList;
//根據(jù)名字和值設(shè)置list
publicstaticvoidsetList(StringobjectName,intindex,Objectelement){
RListObjectobjectRList=redissonClient.getList(objectName);
objectRList.set(index,element);
//根據(jù)名字獲取bucket
publicstaticTRBucketTgetRBucket(StringobjectName){
RBucketTbucket=redissonClient.getBucket(objectName);
returnbucket;
//根據(jù)名字和值設(shè)置對(duì)應(yīng)的bucket
publicstaticTTsetBucket(StringobjectName,Stringvalue){
RBucketObjectbucket=redissonClient.getBucket(objectName);
bucket.set(value);
Tt=(T)bucket.get();//值類型由返回值確定
returnt;
}
乍一看好像沒問題我寫一個(gè)靜態(tài)方法然后在方法中使用靜態(tài)變量redissonClient,哇....,一切看得如此正常
當(dāng)我開始測(cè)試時(shí),NPE.............,我去這是怎么回事,自己在想這不科學(xué)啊,怎么會(huì)空指針,于是我開始找原因
最后發(fā)現(xiàn)是基礎(chǔ)不牢啊............,對(duì)jvm的類加載機(jī)制幾乎就沒考慮,簡(jiǎn)要說要錯(cuò)誤的原因
jvm在進(jìn)行類加載的時(shí)候,首先會(huì)加載類變量,類方法,也就是我這里被static修飾的方法,然后當(dāng)我調(diào)用靜態(tài)方法進(jìn)行使用的時(shí)候,會(huì)使用到redissionClient,注意這個(gè)redissionClient是通過autowired進(jìn)來的,關(guān)鍵問題就在這里,autowired的底層是通過構(gòu)造器和set方法注入bean的
redissionClient被static修飾并且還是一個(gè)接口在被調(diào)用的時(shí)候肯定沒有實(shí)例化
下面提供三種方式正確使用
packagecom.wt.redission.wtredission.utils;
importorg.redisson.api.*;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importjava.util.List;
@Component
publicclassRedissionUtils{
privatestaticRedissonClientredissonClient;
@Autowired
publicRedissionUtils(RedissonClientredissonClient){
RedissionUtils.redissonClient=redissonClient;
publicstaticRLockgetRLock(StringobjectName){
RLockrLock=redissonClient.getLock(objectName);
returnrLock;
//根據(jù)名字獲取map
publicstaticK,VRMapK,VgetRMap(StringobjectName){
RMapK,Vmap=redissonClient.getMap(objectName);
returnmap;
//根據(jù)名字和值設(shè)置map
publicstaticvoidsetMap(StringobjectName,Objectkey,Objectvalue){
RMapObject,Objectmap=redissonClient.getMap(objectName);
map.put(key,value);
//根據(jù)名字獲取set
publicstaticVRSetVgetSet(StringobjectName){
RSetVset=redissonClient.getSet(objectName);
returnset;
//根據(jù)名字和值設(shè)置set
publicstaticvoidsetSet(StringobjectName,Objectvalue){
RSetObjectset=redissonClient.getSet(objectName);
set.add(value);
//根據(jù)名字獲取list
publicstaticVRListVgetRList(StringobjectName){
RListVrList=redissonClient.getList(objectName);
returnrList;
//根據(jù)名字和值設(shè)置list
publicstaticvoidsetList(StringobjectName,intindex,Objectelement){
RListObjectobjectRList=redissonClient.getList(objectName);
objectRList.set(index,element);
//根據(jù)名字獲取bucket
publicstaticTRBucketTgetRBucket(StringobjectName){
RBucketTbucket=redissonClient.getBucket(objectName);
returnbucket;
//根據(jù)名字和值設(shè)置對(duì)應(yīng)的bucket
publicstaticTTsetBucket(StringobjectName,Stringvalue){
RBucketObjectbucket=redissonClient.getBucket(objectName);
bucket.set(value);
Tt=(T)bucket.get();//值類型由返回值確定
returnt;
}
packagecom.wt.redission.wtredission.utils;
importorg.redisson.api.*;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importjavax.annotation.PostConstruct;
@Component
publicclassRedissionUtils2{
@Autowired
RedissonClientredissonClient;
publicstaticRedissionUtils2redissionUtils;
@PostConstruct
publicvoidinit(){
redissionUtils=this;
redissionUtils.redissonClient=this.redissonClient;
publicstaticRLockgetRLock(StringobjectName){
RLockrLock=redissionUtils.redissonClient.getLock(objectName);
returnrLock;
//根據(jù)名字獲取map
publicstaticK,VRMapK,VgetRMap(StringobjectName){
RMapK,Vmap=redissionUtils.redissonClient.getMap(objectName);
returnmap;
//根據(jù)名字和值設(shè)置map
publicstaticvoidsetMap(StringobjectName,Objectkey,Objectvalue){
RMapObject,Objectmap=redissionUtils.redissonClient.getMap(objectName);
map.put(key,value);
//根據(jù)名字獲取set
publicstaticVRSetVgetSet(StringobjectName){
RSetVset=redissionUtils.redissonClient.getSet(objectName);
returnset;
//根據(jù)名字和值設(shè)置set
publicstaticvoidsetSet(StringobjectName,Objectvalue){
RSetObjectset=redissionUtils.redissonClient.getSet(objectName);
set.add(value);
//根據(jù)名字獲取list
publicstaticVRListVgetRList(StringobjectName){
RListVrList=redissionUtils.redissonClient.getList(objectName);
returnrList;
//根據(jù)名字和值設(shè)置list
publicstaticvoidsetList(StringobjectName,intindex,Objectelement){
RListObjectobjectRList=redissionUtils.redissonClient.getList(objectName);
objectRList.set(index,element);
//根據(jù)名字獲取bucket
publicstaticTRBucketTgetRBucket(StringobjectName){
RBucketTbucket=redissionUtils.redissonClient.getBucket(objectName);
returnbucket;
//根據(jù)名字和值設(shè)置對(duì)應(yīng)的bucket
publicstaticTTsetBucket(StringobjectName,Stringvalue){
RBucketObjectbucket=redissionUtils.redissonClient.getBucket(objectName);
bucket.set(value);
Tt=(T)bucket.get();//值類型由返回值確定
returnt;
}
方式三通過spring上下文獲取
packagecom.wt.redission.wtredission.utils;
importio.micrometer.core.instrument.util.StringUtils;
importorg.springframework.beans.BeansException;
importorg.springframework.beans.factory.NoSuchBeanDefinitionException;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;
importorg.springframework.context.annotation.Scope;
importorg.springframework.stereotype.Component;
importjavax.servlet.http.HttpServletRequest;
*SpringContext工具類.
*@author:Hohn
@Component
@Scope("singleton")
publicclassSpringUtilimplementsApplicationContextAware{
*Spring應(yīng)用上下文環(huán)境.
privatestaticApplicationContextapplicationContext;
*實(shí)現(xiàn)ApplicationContextAware接口的回調(diào)方法,設(shè)置上下文環(huán)境
*brparam:applicationContext
*@throwsBeansException
@Override
publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{
SpringUtil.applicationContext=applicationContext;
*獲取ApplicationContext.
*brreturn:ApplicationContext
publicstaticApplicationContextgetApplicationContext(){
returnapplicationContext;
*獲取對(duì)象.
*brparam:name
*brreturn:Object一個(gè)以所給名字注冊(cè)的bean的實(shí)例
*@throwsBeansException
@SuppressWarnings("unchecked")
publicstaticTTgetBean(Stringname)throwsBeansException{
return(T)applicationContext.getBean(name);
*獲取類型為requiredType的對(duì)象.
*brparam:clz
*brreturn:
*@throwsBeansException
publicstaticTTgetBean(ClassTclz)throwsBeansException{
return(T)applicationContext.getBean(clz);
*如果BeanFactory包含一個(gè)與所給名稱匹配的bean定義,則返回true
*brparam:name
*brreturn:boolean
publicstaticbooleancontainsBean(Stringname){
returnapplicationContext.containsBean(name);
*判斷以給定名字注冊(cè)的bean定義是一個(gè)singleton還是一個(gè)prototype。
*如果與給定名字相應(yīng)的bean定義沒有被找到,將會(huì)拋出一個(gè)異常(NoSuchBeanDefinitionException)
*brparam:name
*brreturn:boolean
*@throwsNoSuchBeanDefinitionException
publicstaticbo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商品管理認(rèn)證資格體系構(gòu)建
- 高級(jí)審計(jì)中的信息安全管理策略試題及答案
- 一級(jí)建造師考試技術(shù)要點(diǎn)試題及答案
- 2025委托維修服務(wù)合同模板
- 關(guān)注細(xì)節(jié)審計(jì)試題及答案
- 2025財(cái)產(chǎn)轉(zhuǎn)讓與權(quán)益分配協(xié)議合同
- 情緒調(diào)節(jié)與壓力管理
- 能源設(shè)備運(yùn)行監(jiān)測(cè)與節(jié)能改造協(xié)議
- 東莞房屋租賃協(xié)議年
- 2025年關(guān)于上海市的租房合同
- 統(tǒng)編版2024-2025第二學(xué)期小學(xué)六年級(jí)期末語文測(cè)試卷(有答案)
- 2025年物流管理專業(yè)考試試卷及答案
- 2025年全國(guó)保密教育線上培訓(xùn)考試試題庫(kù)及參考答案【鞏固】含答案詳解
- 中藥學(xué)三基題庫(kù)
- 關(guān)鍵設(shè)備管理與維護(hù)策略
- 中華人民共和國(guó)民營(yíng)經(jīng)濟(jì)促進(jìn)法
- 臨床類面試真題及答案
- 夫妻間借款協(xié)議合同
- 【8地一模 初二會(huì)考】2025年安徽省亳州市利辛縣中考一模地理試題(含解析)
- ktv服務(wù)員合同協(xié)議書范本
- 2025年中國(guó)心電電極片市場(chǎng)調(diào)查研究報(bào)告
評(píng)論
0/150
提交評(píng)論