1. 程式人生 > >spring專案中靜態方法中使用注入的bean

spring專案中靜態方法中使用注入的bean

1. 說明:

專案中涉及到dubbo服務,在專案中需要將這個服務作為一個bean注入,由於本人需要在靜態方法中使用這個bean,所以如果使用類似@Autowire等註解注入時會編譯報錯。

2. 解決方法:

自己寫一個工具類,通過spring上下文獲取這個bean。轉成靜態的。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * <p>
 * <code>SpringContextHelper</code>
 * </p>
 * Description:
 *
 * @author xxx
 * @date 2017/12/28 10:34
 */

/*
 * @Component泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註。
 * 標記為元件後在啟動服務時,會將此類例項化到spring容器中,相當於配置檔案中的<bean id="" class=""/>
 */
@Component
public class SpringContextHelper implements ApplicationContextAware{

    /**
     * Spring應用上下文環境
     */
    private static ApplicationContext applicationContext;

    /**
     * 重寫並初始化上下文
     * @param applicationContext 應用上下文
     * @throws BeansException bean異常
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 初始化applicationContext
        SpringContextHelper.applicationContext = applicationContext;
    }

    /**
     * 通過類獲取
     * @param clazz 注入的類
     * @param <T> 返回型別
     * @return 返回這個bean
     * @throws BeansException bean異常
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(Class clazz) throws BeansException {
        return  (T)applicationContext.getBean(clazz);
    }

    /**
     * 通過名字獲取
     * @param name 名字
     * @param <T> 返回型別
     * @return 返回這個bean
     * @throws BeansException bean異常
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }
}
在需要使用的類中注入你的bean使用即可
private static EmployeeService employeeService = SpringContextHelper.getBean(EmployeeService.class);

網上還有類似的解決辦法,例如使用@PostConstruct等,或是直接先例項化這個類,再呼叫,如new TestClass().employeeService(在這裡肯定不適用),我都嘗試了下,沒有成功。

相關推薦

spring專案靜態方法使用注入bean

1. 說明: 專案中涉及到dubbo服務,在專案中需要將這個服務作為一個bean注入,由於本人需要在靜態方法中使用這個bean,所以如果使用類似@Autowire等註解注入時會編譯報錯。 2. 解決方法: 自己寫一個工具類,通過spring上下文獲取這個bean。轉成靜態

Spring靜態方法使用@Resource註解的變數

Spring框架中使用靜態注入 開發中,有些時候可能會工具類的靜態方法,而這個靜態方法中又使用到了@Resource註解後的變數。如果要直接使用 Utils.staticMethod(),專案會

java靜態方法為什麼不能使用this、super和直接呼叫非靜態方法

這個要從java的記憶體機制去分析,首先當你New 一個物件的時候,並不是先在堆中為物件開闢記憶體空間,而是先將類中的靜態方法(帶有static修飾的靜態函式)的程式碼載入到一個叫做方法區的地方,然後再在堆記憶體中建立物件。所以說靜態方法會隨著類的載入而被載入。當你new一個物件時,該物件存在於對

Spring 無法注入靜態變數,直接在靜態方法獲取bean

模組中想把一個類寫成工具類,提供靜態方法呼叫。但是方法中要用到@autowire注入的dao類變數,它要能在靜態方法中使用的話本身就加上static,但是static變數是無法用@autowire注入的。 @Autowired private AppConfMapper m

使用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;

SpringMVC靜態方法如何注入service非靜態方法,如何在contextInitialized之前注入bean,使service不會報空

    1.靜態方法中不能用非靜態方法    首先宣告java中只有靜態方法和靜態引數,沒有靜態類。但可以在類中將自己宣告稱靜態引數,從而模擬將整個類都靜態載入在快取中,具體下面再詳細講。    因為靜態方法在程式啟動時就載入,而非靜態方法此時還不在記憶體中(spring中加

spring靜態方法使用bean物件

方法: 在類中建立一個靜態的bean物件,然後使用init方式初始化這個bean,這樣就可以在靜態方法中呼叫了 @Service("idg") public class IDGenerator { @Autowired

spring注入的方式實現靜態方法使用非靜態變數

實現靜態方法中使用非靜態變數 程式碼示例: public class TestClass{   private SystemConfig config;   private static TestClass test;   public TestClass()

靜態方法直接使用註入的bean對象

進行 stat 註入 問題 就會 ces 直接 static scrip 問題:靜態方法中註入bean分析問題:先看一段代碼 @Componentpublic class ScriptExecuteContent { @Autowired private static S

在工具類靜態方法使用Spring的元件

/** * @author Dongguabai * @date 2018/9/27 10:14 */ @Component public class VwOrgSupport { /** * 可顯示最低級別orgType */ p

解決SpringQuart無法自動注入Bean問題

        因專案需求,之前專案中已經有定時器的例子了,但是需求那邊過來的需求之前用的定時器並不能滿足,之前的定時器是用spring裡面的@Scheduled(cron = "0 0 0 * * ? ")這種方式,這是一種死的定時器,需求要的是動態定時器,使用者新增一個

VS2013編譯專案靜態使用MFC出現錯誤的解決方法

前言 由於需要將VS2013環境下編譯的程式考給沒有安裝VS2013環境的電腦中使用,解決方式有3種,colorfulpieces部落格中有介紹。 1. 採用靜態編譯 2. 將mfc100.dll和應用程式一起打包釋出 3. 將程式和vcredist20

關於jpa的Specification自定義函式,實現oracle的decode;以及如何在靜態方法呼叫注入的service

如何在靜態方法中呼叫注入的service Public class ClassA{  public static ClassA classA;  @Resource  private Service service;   //原理時在工程啟動時載入,在靜態方法前載入,這樣就可以在靜態方法中呼叫注入的

php靜態方法的使用

time ima 方法 cte count() turn font 應該 面向對象 靜態方法 (1)靜態方法不能訪問這個類中的普通屬性,因為那些屬性屬於一個對象,但可以訪問靜態屬性; (2)從當前類(不是子類)中訪問靜態方法或屬性,可以使用 self 關鍵字,self 指向

python靜態方法、類方法、屬性方法區別

ref self 使用 lan com 通過 場景 UNC cme 在python中,靜態方法、類方法、屬性方法,剛接觸對於它們之間的區別確實讓人疑惑。 類方法(@classmethod) 是一個函數修飾符,表是該函數是一個類方法 類方法第一個參數是cls,而實例方法第

php靜態方法靜態屬性的介紹

靜態屬性 size col 實例 生效 訪問類 都是 靜態 self 靜態分為兩個部分:靜態屬性和靜態方法 靜態的東西都是給類用的(包括類常量),非靜態的都是給對象用的 靜態屬性 在定義屬性的時候,使用關鍵字static修飾的屬性稱之為靜態屬性。 靜態方法 使用sta

靜態方法只允許訪問靜態數據,那麽,如何在靜態方法訪問類的實例成員(即沒有附加static關鍵字的字段或方法)?

static關鍵字 實例成員 clas 靜態 image eth sys 靜態方法 http package test.two; public class jingtaihanshu { int x = 3; static int y

靜態方法訪問類的例項成員

例項程式碼 public class Example { int x = 3;//類的例項變數,初始化值為3 static int y = 4;//類的靜態變數,初始化值為4 public static void method()//靜態方法 { System.out.prin

靜態方法不可直接new內部類例項物件問題

結論:靜態方法中,是不可以直接new內部類例項物件和引用外部類的成員變數的。 原因:1、外部類中的成員變數、方法以及內部類其實三者都在同一個級別上,三者都必須由外部類的例項物件才能呼叫(舉例:當一個方法被呼叫時,此時肯定已經有了外部類的例項物件。),故而他們三者可以互相引用。 2、而靜