2011-08-31 59 views
36

有了這個類Spring:如何向靜態字段注入值?

@Component 
public class Sample { 

     @Value("${my.name}") 
    public static String name; 


} 

如果我嘗試Sample.name,它始終是 '空'。所以我嘗試了這個。

public class Sample { 

    public static String name; 

    @PostConstruct 
    public void init(){ 
     name = privateName; 
    } 

    @Value("${my.name}") 
    private String privateName; 

    public String getPrivateName() { 
     return privateName; 
    } 

    public void setPrivateName(String privateName) { 
     this.privateName = privateName; 
    } 

} 

此代碼有效。 Sample.name設置正確。這是不是好方法?如果沒有,有沒有更好的方法?以及如何做到這一點?

+0

這不會解決;如果在創建對象之前使用靜態變量。例如)如果在靜態塊下使用靜態變量來構建資源,則資源將被構造爲空值。 –

回答

55

冷杉,public staticfinal字段是邪惡。由於某種原因,Spring不允許注入這些字段。

您的解決方法是有效的,您甚至不需要getter/setter,private字段就足夠了。在另一方面試試這個:

@Value("${my.name}") 
public void setPrivateName(String privateName) { 
    Sample.name = privateName; 
} 

(可與@Autowired/@Resource)。但給你一些建設性的建議:創建一個private字段和getter而不是public static字段的第二個類。

+4

對於「公共靜態非最終領域是邪惡的」,你能否給我一些參考? – Anderson

+3

非最終意味着您可以修改字段值,對於靜態字段,這意味着處理線程併發性 - 也就是堆棧中的痛苦。 –

+0

如何在靜態塊中使用@Value?請指導我們...問候,Neha – 2015-11-18 11:28:34