2013-10-27 71 views
8

這個問題看起來有點奇怪。假設我有一個服務,我想在具有一些靜態方法的Utility類中使用。該服務是一個Spring bean,很自然我會使用setter和(@Autowired)將它注入我的實用類。如在Spring的文檔中提到的,所有bean在bean上下文中都是靜態的。所以當你想在一個類中注入一個bean時,你不必使用「static」修飾符。請看下圖:在靜態方法中使用注入bean的正確方法是什麼?

 

public class JustAClass{ 
    private Service service; 

    public void aMethod(){ 
    service.doSomething(....); 
    } 

    @Autowired 
    public void setService(Service service){ 
    this.service = service; 
    } 

} 
 

現在回到了我第一個提到的(靜態方法使用Service):

 

public class JustAClass{ 
    private static Service service; 

    public static void aMethod(){ 
    service.doSomething(....); 
    } 

    @Autowired 
    public void setService(Service service){ 
    this.service = service; 
    } 

} 
 

雖然服務是靜態的,我不得不把靜態的定義後面。這對我來說有點反直覺。這是錯的嗎?還是更好的方法? 謝謝

回答

12

您無法自動裝載靜態字段。

但是你可以做一個小的解決方法:

@Component 
public class JustAClass{ 
    private static Service service; 

    @Autowired 
    private Service tmpService; 

    @PostConstruct 
    public void init() { 
    service = tmpService; 
    } 

} 

注意,你必須聲明這個類的「分量」注入tmpService

+0

這是很好的,對我的作品! – Kaunteya

+0

這是否會定期完成?或者在這些情況下通常採用不同的方法? –

3

你別無選擇。如果你想初始化一個類的static字段,你將不得不讓Spring創建該類的一個實例並注入該值。

有一點建議。在這種情況下,你真的沒有理由使用static方法。如果你想要一個單例實用程序,只需讓你的bean具有singleton範圍。

相關問題