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