1. 程式人生 > >Spring在Thread中注入Bean無效的解決方式[嗡湯圓的小筆記]

Spring在Thread中注入Bean無效的解決方式[嗡湯圓的小筆記]

在Spring專案中,有時需要新開執行緒完成一些複雜任務,而執行緒中可能需要注入一些服務。而通過Spring注入來管理和使用服務是較為合理的方式。但是若直接在Thread子類中通過註解方式注入Bean是無效的。

因為Spring本身預設Bean為單例模式構建,同時是非執行緒安全的,因此禁止了在Thread子類中的注入行為,因此在Thread中直接注入的bean是null的,會發生空指標錯誤。

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

錯誤的注入方法

@Controller
public class SomeController{
    @ResponseBody
    @RequestMapping
("test") String testInjection(){ // 直接建立並執行執行緒 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中注入服務 @AutoWired SomeService someService public void execute() { new Worker().start(); } // 執行緒內部類,Thread或者Runnable均可 private class Worker extends Thread { @Override public void run() { // do something... SomeThread.this.someService.doSomething(); // 此時someService已被注入,非null. } } }

正常呼叫someService。

通過外部引入

即在可以注入的地方先得到可用的例項,在通過Thread子類的建構函式引入。這樣會使得在進行程式碼修改時,影響到每個使用Thread子類的程式碼,修改工作量大。

@Controller
public class SomeController{
    // 通過註解注入Service
    @AutoWired
    SomeService someService;
    @ResponseBody
    @RequestMapping("test")
    String testInjection(){
        // 通過建構函式從外部引入
        new Worker(someService).start();
    }
}

public class SomeThread {
    private SomeService someService;
    public SomeThread(SomeService someService){
        // 通過建構函式從外部引入
        this.someService  = someService;
    }
    @Override
    public void run() {
        // do something...
        someService.doSomething();
        // 此時someService非null.
    }
}

相關推薦

Spring在Thread注入Bean無效解決方式[湯圓筆記]

在Spring專案中,有時需要新開執行緒完成一些複雜任務,而執行緒中可能需要注入一些服務。而通過Spring注入來管理和使用服務是較為合理的方式。但是若直接在Thread子類中通過註解方式注入Bean是無效的。 因為Spring本身預設Bean為單例模式構建,

springboot 攔截器intecpter不能注入bean解決方案

顯而易見,攔截器的執行是在bean的初始化之前,所以如果在程式碼中直接寫上如下圖所示   因為UserService初始化在攔截器之後. 所以要在攔截器中直接注入 現在探索出兩種方式 第一種 在攔截器配置檔案中注入UserService 把userService作為引數傳遞

已經解決 spring boot 攔截器注入bean

已經解決 spring boot 攔截器中如何注入bean的問題 @Configuration public class MyWebAppConfigurer extends WebMvcConfigurerAdapter @Bean RequestInterce

關於springboot請求攔截器獲取不到bean解決方式【轉載部分修改】

介紹: 在企業開發中無論是大的專案還是小的專案,所以的web介面都可能會遇到需要進行許可權驗證/登陸驗證/授權認證的攔截。我常用的做法就是將登陸資訊/許可權資訊存入redis,前端返回token,每次請求時進行驗籤;在進行驗籤時需要通過redis元件進行操作redis快取,

第三篇:開發的問題及解決方式

.text cat 彈窗 ret 如何 配置 中項 新的 顯示 1.texarea 如何保存空格、換行? 答:var content1= $("#content").val(); var content =content1.replace(/\n|\r\n/g,"&

vue-cli 構建項目在IE無法運行解決方式(build之後可運行)

會有 支持 run nbsp happy 是我 word htm 項目 IE瀏覽器(只考慮IE11,更低版本我沒考慮)運行時報 Promise未定義的錯誤 解決辦法: 1. 安裝babel-polyfill   (1.)  npm install babel-poly

spring抽象類注入bean

在使用spring的時候,有時由於設計的需要,需要使用抽象類(比如模板方法模式),但在抽象類中實現方法是需要依賴其他的介面或類的方法,這時就需要對依賴的介面或類進行注入,需要注意以下內容: 在抽象類中需要注入(@autowire),在繼承了該抽象類的子類中同樣需要再次注入。比如當前專案中,使用者

如何在執行多執行緒注入bean

轉:https://segmentfault.com/q/1010000007172414?_ea=1264473 如何在多執行緒中注入bean?!​​​​​​​ 問題對人有幫助,內容完整,我也想知道答案0問題沒有實際價值,缺少關鍵內容,沒有改進餘地 前幾天,在sf這裡也提過這個問題,但

SSM專案 單元測試 注入bean 空指標異常

java.lang.NullPointerException at com.cumt.service.ShopCategoryServiceTest.testGetShopCategoryList(ShopCategoryServiceTest.java:22) at sun.reflect.NativeMe

springWeb專案啟動時自動載入方法及web專案啟動時不能獲得spring的bean解決方式

方式一:利用註解的方式和構造方法 @Service("testService") public class TestService { @Autowired private Service service; /** * spring在初始化bea

Spring Boot無法自動注入bean問題解決方案

前言:在使用Spring Boot+Mybatis時,寫完Mapper介面、Service、Controller後,啟動(圖1)打包專案(圖2)均失敗,提示無法自動注入bean。完成目標:1、無法自動注入bean錯誤資訊2、程式碼展示3、解決方案一、錯誤資訊:Descript

關於spring boot無法自動注入bean問題解決方案

. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_|

靜態變數注入bean解決方法

解決方法是新建一個類,這個類實現ApplicationContextAware,並重寫setApplicationContext方法。具體請見下面原始碼: import org.springframework.beans.BeansException; import org

idea在maven匯入jstl無效解決辦法

首先在pom中新增依賴 <dependency> <groupId>javax.servlet</groupId> <

在URL傳遞中文的解決方式

在URL中傳遞中文的解決方式 2015年05月13日 17:13:55 thinkinglink 閱讀數:10321 標籤: URL編碼中文編碼亂碼解決 更多 個人分類: web前端 在URL中傳遞中文的解決方式 1.第一種

使用Spring註解,在靜態方法注入bean(spring靜態注入元件——工具類常用)

如果直接用spring注入靜態屬性,則會報錯,提示@Resource annotation is not supported on static fields,如果又一定要通過spring注入bean,可以採用@PostConstruct註解在某個用來初始化的方法上,注入時注

使用Spring註解,在靜態方法注入bean

@Component public class FTPUtil { //通過dicService讀取資料庫中的FTP引數 @Autowired private DicService dicService; private static FTPUtil fTPUtil;

spring注入bean兩種方式(屬性注入,構造器注入

利用Spring的IOC實現簡單小程式,Spring推薦介面程式設計,這裡定義兩個介面:IDao,IService,以及它們的實現類IDaoImpl,IServiceImpl,程式碼如下: package DAO; public interface IDao {public

springBoot 在utils工具類 注入bean

現在想要做的事情是在DownLoadUtils工具類中,讀取到設定啟動類中的環境變數。 操作是 1. 將 class DownLoadUtils 上新增 @Component 宣告其為bean元件

spring在靜態類注入bean的的解釋

@Component public class ModelMapper { @AutoWired private static