1. 程式人生 > >Thread子類中,不能使用Spring註解,變數為null

Thread子類中,不能使用Spring註解,變數為null

執行緒裡面,不能使用註解,Spring本身預設Bean為單例模式構建,同時是非執行緒安全的,因此禁止了在Thread子類中的注入行為,因此在Thread中直接注入的bean是null的。
解決辦法有很多個,可自行在網上搜索,本文的解決辦法如下:

  1. 建立SpringContextUtils類如下。
package com.vdes.modles.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import
org.springframework.stereotype.Repository; import org.springframework.util.Assert; @Repository public class SpringContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws
BeansException { this.applicationContext = applicationContext; } public static ApplicationContext getContext() { return applicationContext; } /** * 從靜態變數ApplicationContext中取得Bean, 自動轉型為所賦值物件的型別. */ @SuppressWarnings("unchecked") public static <T> T getBean
(String name) { checkApplicationContext(); return (T) applicationContext.getBean(name); } /** * 從靜態變數ApplicationContext中取得Bean, 自動轉型為所賦值物件的型別. */ @SuppressWarnings("unchecked") public static <T> T getBean(Class<T> clazz) { checkApplicationContext(); return (T) applicationContext.getBeansOfType(clazz); } private static void checkApplicationContext() { Assert.notNull(applicationContext, "applicaitonContext未注入,請在applicationContext.xml中定義SpringContextUtil"); } }

由於執行緒內不能使用註解,可以使用該類來獲取bean

  1. 在Spring配置檔案中,新增如下程式碼,配置bean
    <bean lass="com.vdes.modles.utils.SpringContextUtils"/> 

3.線上程類裡面,使用如下程式碼來獲取bean

   VdesMessageService vdesMessageService = SpringContextUtils.getBean("vdesMessageServiceImpl");

這裡需要注意的是,getBean()的引數應該為配置bean的id,由於本專案使用了註解掃描,並沒有為每一個類去配置bean,在使用id的時候,Spring預設id為類名首字母小寫。記住,getBean,get的只能是物件,對應的是Class ,而不能是介面,使用Service的時候,要使用它的具體實現類。

相關推薦

Thread不能使用Spring註解變數null

執行緒裡面,不能使用註解,Spring本身預設Bean為單例模式構建,同時是非執行緒安全的,因此禁止了在Thread子類中的注入行為,因此在Thread中直接注入的bean是null的。 解決辦法有很多個,可自行在網上搜索,本文的解決辦法如下: 建立Spr

如何在匿名thread保證執行緒安全

在做效能測試的過程中,我寫了兩個虛擬類ThreadLimitTimeCount和ThreadLimitTimesCount做框架,通過對執行緒的標記來完成超時請求的記錄。舊方法如下: @Override protected void after() { requestMark.add

spring自定義@AutoWired標識的元素注入null

最近在做專案的時候,發現程式執行的時候有一個nullpointer exception,一臉懵逼因為感覺程式沒什麼邏輯。後來發現是因為new出來的component不會自動注入它的元素。 現象:@Component修飾的自定義普通類中@Autowired屬性為null 原因:如果是通過new例項化的物件,

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

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

如果父有構造函數並且構造函數有參數沒有因為繼承了這個構造函數那麽創建對象的時候要傳參

bsp class nbsp 參數 int init log ini elf 1 class a(): 2 def __init__(self,aa): 3 self.aa = aa 4 class b(a): 5 def do(self)

JavaSE8基礎 當父的成員變量重名了使用super.名字 來訪問父的成員變量

public xtend tca ima his window logs java brush os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0)

JavaSE8基礎 不同包下的創建對象可以繼承到父的 受保護/公有方法

cas jdk .sh imp java png pack ges pre os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0) 代碼: 

的屬性跟父的屬性重名的時候會優先使用的屬性

sta animal package 方法 pack stat ack har () package charter05; public class Animal { int age = 8; //如果父類中顯示的聲明了有參的構造方法, //而子類中沒有顯示的聲明有參構造方

使用spring註解@Autowired獲取到的物件null

最近工作中遇到一個關於@AutoWired註解使用的細節問題,以前沒有注意到,現在特意記錄一下。 問題描述:在我的一個工具類中,使用@Autowired需要注入一個dao物件,然後工具類的方法中會呼叫該dao物件中的方法,在執行時發現報空指標異常,dao物件居然是null。 相關程式碼如下:

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

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

使用spring註解注入sessionFactory

簡述 目前使用spring hibernate作為專案的框架,並且使用註解方式進行物件裝載。在裝載Dao物件的時候常常需要注入sessionFactory物件,通常的做法是Dao繼承至HibernateDaoSuppor,t然後在Dao中新增setSuperSessionF

Java的普通程式碼塊構造程式碼塊靜態程式碼塊 初始化

//示例程式碼: public class HelloB extends HelloA{ public HelloB(){ System.out.println("子類構造方法"); }

定義抽象方法同時在通過重寫的方法實現該抽象方法

建立抽象類: package my; abstract class Fruit { public String color; public Fruit(){ color="綠色"; } public abstract voi

JavaSE8基礎 多態 創建對象的時候先對初始化父

java ges 構造方法 eclipse clas public 視頻 初始化 ati os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0)

總結本次實訓springMVC常用的註解@以後用到別的會持續更新

col ring key值 ppi div jsp頁面 ajax請求 map spa @Repository //dao層註解。聲明本層為dao層。 @serivce //service層。 @controller //con層。 @auto

窗體的基沒有設定大小所以才不能居中若要窗體居中必須使用setfixedsize()函數或者resize()函數設定窗體的大小居中才能正常使用

argv parent tails comment styles key har 位置 遇到 最近開發中,遇到了窗體不能居中的問題,看了網上的很多文章,窗口居中,無非都是move至窗口的中心目標; 有兩種方式, 一種在構造函數中直接計算中心坐標; 另一種是在窗口show後再

web工程啟動時在一個延遲載入Bean因為該Bean可能還沒被JVM載入

   問題描述: (1)javaWeb專案啟動中,還沒啟動完成,在下面這個類載入另一個Bean類, (2)通過getBean方法獲取到該Bean,可以獲取到,不為null (3)但是,呼叫該Bean的方法insertSelective()方法,進不去該方法   &nb

java異常練習題:定義一個MulException繼承Exception要求兩數相乘等於100報錯在主定義一個方法在方法丟擲此異常在主方法觀察結果

題目描述: 定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。  定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義

1).定義一個MulException繼承Exception要求兩數相乘等於100報錯在主定義一個方法在方法丟擲此異常在主方法觀察結果。

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 2).定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義一個方法,在方法中丟

向controller傳一個有一個list400,415,500

報錯有可能是json格式不對,controller沒有@RequestBody,ajax沒有 contentType: 'application/json;charset=UTF-8', data: JSON.stringify(datas),//data沒有JSON.stringify()