最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決Spring在Thread中注入Bean無效的問題

 更新時間:2022年02月24日 09:41:16   作者:嗡湯圓  
這篇文章主要介紹了解決Spring在Thread中注入Bean無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在Thread中注入Bean無效

在Spring項目中,有時需要新開線程完成一些復(fù)雜任務(wù),而線程中可能需要注入一些服務(wù)。而通過Spring注入來管理和使用服務(wù)是較為合理的方式。但是若直接在Thread子類中通過注解方式注入Bean是無效的。

因為Spring本身默認(rèn)Bean為單例模式構(gòu)建,同時是非線程安全的,因此禁止了在Thread子類中的注入行為,因此在Thread中直接注入的bean是null的,會發(fā)生空指針錯誤。

以下分別列舉錯誤的注入方法和兩種解決方式。

錯誤的注入方法

@Controller
public class SomeController{
? ? @ResponseBody
? ? @RequestMapping("test")
? ? String testInjection(){
? ? ? ? // 直接創(chuàng)建并運行線程
? ? ? ? new SomeThread().start();
? ? }
}
// 直接編寫線程
public SomeThread extends Thread {
? ? @Autowired
? ? SomeService someService;
? ? @Override
? ? public void run(){
? ? ? ? // do something...
? ? ? ? someService.doSomething();
? ? ? ? // 此時 someService實例是null.
? ? }
}

報NullpointException。

通過封裝Thread子類注入

個人比較推薦這種方法,對外部代碼的影響較小。

@Controller
public class SomeController{
? ? // 通過注解注入封裝線程的Bean
? ? @AutoWired
? ? SomeThread someThread;
? ? @ResponseBody
? ? @RequestMapping("test")
? ? String testInjection(){
? ? ? ? // 通過注入的Bean啟動線程
? ? ? ? someThread.execute();
? ? }
}
@Component
public class SomeThread {
? ? // 封裝Bean中注入服務(wù)
? ? @AutoWired
? ? SomeService someService
? ? public void execute() {
? ? ? ? new Worker().start();
? ? }
? ? // 線程內(nèi)部類,Thread或者Runnable均可
? ? private class Worker extends Thread {
? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? // do something...
? ? ? ? ? ? SomeThread.this.someService.doSomething();
? ? ? ? ? ? // 此時someService已被注入,非null.
? ? ? ? }
? ? }
}

正常調(diào)用someService。

通過外部引入

即在可以注入的地方先得到可用的實例,在通過Thread子類的構(gòu)造函數(shù)引入。這樣會使得在進(jìn)行代碼修改時,影響到每個使用Thread子類的代碼,修改工作量大。

@Controller
public class SomeController{
? ? // 通過注解注入Service
? ? @AutoWired
? ? SomeService someService;
? ? @ResponseBody
? ? @RequestMapping("test")
? ? String testInjection(){
? ? ? ? // 通過構(gòu)造函數(shù)從外部引入
? ? ? ? new Worker(someService).start();
? ? }
}
public class SomeThread {
? ? private SomeService someService;
? ? public SomeThread(SomeService someService){
? ? ? ? // 通過構(gòu)造函數(shù)從外部引入
? ? ? ? this.someService ?= someService;
? ? }
? ? @Override
? ? public void run() {
? ? ? ? // do something...
? ? ? ? someService.doSomething();
? ? ? ? // 此時someService非null.
? ? }
}

Spring多線程中bean的注入問題

最近碰到了一個問題,使用SSM框架,在Service層需要另開一個線程,這個線程專門用來做一些操作,并將結(jié)果寫入數(shù)據(jù)庫中。但是在線程中使用@Resource或者@Autowired注入全部為NULL,原來是Spring不能在線程中注入。

網(wǎng)上的主要解決方法有

  • 將需要的Bean作為線程的的構(gòu)造函數(shù)的參數(shù)傳入
  • 使用ApplicationContext.getBean方法來靜態(tài)的獲取Bean

我的線程中所需要的Bean的數(shù)量較多,并且以后還有可能增加或者減少,所以方法1并不適合

我的Spring配置文件并不只一個,而且使用getBean方法需要重新加載一遍所有的Bean,這樣也違反的Spring的IoC,并不是我想要的,所以也不采用方法2

最后確定使用內(nèi)部類的方法,將線程中需要的Bean提前注入好,大致的結(jié)構(gòu)如下:

@Service
class TestExample{
    //這兩個為線程所需要的Bean
    @Resource
    TestDao testDao;
    @Resource
    NeedDap needDao;
    public void serviceExecute(){
        //在這里開啟線程,執(zhí)行操作
        ThreadExample te = new ThreadExample();
        te.start();
    }
    
    //內(nèi)部類
    private class ThreadExample extends Thread{
        public ThreadExample(){
            //也可以在構(gòu)造函數(shù)中傳入?yún)?shù)
        }
        public void run(){
            //這里為線程的操作
            //就可以使用注入之后Bean了
        }
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決JAVA8 Collectors.toMap value為null報錯的問題

    解決JAVA8 Collectors.toMap value為null報錯的問題

    這篇文章主要介紹了解決JAVA8 Collectors.toMap value為null報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java實現(xiàn)精準(zhǔn)Excel數(shù)據(jù)排序的方法詳解

    Java實現(xiàn)精準(zhǔn)Excel數(shù)據(jù)排序的方法詳解

    在數(shù)據(jù)處理或者數(shù)據(jù)分析的場景中,需要對已有的數(shù)據(jù)進(jìn)行排序,在Excel中可以通過排序功能進(jìn)行整理數(shù)據(jù),而在Java中,則可以借助Excel表格插件對數(shù)據(jù)進(jìn)行批量排序,下面我們就來學(xué)習(xí)一下常見的數(shù)據(jù)排序方法吧
    2023-10-10
  • 初始JAVA模塊化開發(fā)的超詳細(xì)步驟(適合菜鳥)

    初始JAVA模塊化開發(fā)的超詳細(xì)步驟(適合菜鳥)

    這篇文章主要介紹了初始JAVA模塊化開發(fā)的超詳細(xì)步驟,詳細(xì)解釋了模塊描述符的職責(zé)、模塊路徑的概念以及如何使用命令行運行模塊化Java程序,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Spring Mybatis Mapper模糊查詢的幾種方法

    Spring Mybatis Mapper模糊查詢的幾種方法

    在Spring結(jié)合Mybatis進(jìn)行開發(fā)時,實現(xiàn)模糊查詢是一個常見需求,在Mybatis中,LIKE查詢可以通過多種方式實現(xiàn),本文給大家介紹了Spring Mybatis Mapper模糊查詢的幾種方法,需要的朋友可以參考下
    2024-03-03
  • springboot整合xxl-job的示例代碼

    springboot整合xxl-job的示例代碼

    這篇文章主要介紹了springboot整合xxl-job的示例代碼,主要分為三大模塊,分別是調(diào)度中心、執(zhí)行器和配置定時任務(wù)的過程,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Maven發(fā)布項目 (jar包) 到Nexus私服中的操作

    Maven發(fā)布項目 (jar包) 到Nexus私服中的操作

    這篇文章主要介紹了Maven發(fā)布項目 (jar包) 到Nexus私服中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 基于springboot微信公眾號開發(fā)(微信自動回復(fù))

    基于springboot微信公眾號開發(fā)(微信自動回復(fù))

    這篇文章主要介紹了基于springboot微信公眾號開發(fā)(微信自動回復(fù)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Mybatis查詢時的延遲加載解析

    Mybatis查詢時的延遲加載解析

    這篇文章主要介紹了Mybatis查詢時的延遲加載解析,先從單表查詢,需要時再從關(guān)聯(lián)表去關(guān)聯(lián)查詢,能大大提高數(shù)據(jù)庫性能,因為查詢單表要比關(guān)聯(lián)查詢多張表速度要快,延遲加載分為兩種:深度延時加載,侵入式延遲加載,需要的朋友可以參考下
    2023-10-10
  • java實現(xiàn)簡易點菜器

    java實現(xiàn)簡易點菜器

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡易點菜器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 一文帶你你搞懂Java的3種IO模型

    一文帶你你搞懂Java的3種IO模型

    在Java中,一共有三種IO模型,分別是阻塞IO(BIO)、非阻塞IO(NIO)和異步IO(AIO),本文將給大家詳解的介紹這三種IO模型,文中有相關(guān)的代碼示例,需要的朋友可以參考下
    2023-05-05

最新評論

鄂托克前旗| 泰来县| 尉氏县| 新竹市| 孝昌县| 吴旗县| 石景山区| 连江县| 永登县| 通辽市| 沁水县| 定远县| 盱眙县| 福清市| 淄博市| 萨嘎县| 科技| 宕昌县| 高陵县| 台南市| 桃江县| 宜春市| 界首市| 中阳县| 乃东县| 金乡县| 大同县| 凌云县| 介休市| 防城港市| 厦门市| 同心县| 饶平县| 凤山市| 漳浦县| 阳原县| 崇阳县| 河北区| 如皋市| 白河县| 揭东县|