2011-08-31 50 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