Spring:如何为静态字段注入值?

Whi*_*hip 72 spring code-injection

有了这堂课

@Component
public class Sample {

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


}
Run Code Online (Sandbox Code Playgroud)

如果我尝试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;
    }  

}
Run Code Online (Sandbox Code Playgroud)

这段代码有效.Sample.name设置得当.这是好方法吗?如果没有,有什么更好的方法吗?怎么做?

Tom*_*icz 90

首先,public staticfinal领域是邪恶的.由于某种原因,Spring不允许注入此类字段.

你的解决方法是有效的,你甚至不需要getter/setter,private字段就足够了.另一方面试试这个:

@Value("${my.name}")
public void setPrivateName(String privateName) {
    Sample.name = privateName;
}  
Run Code Online (Sandbox Code Playgroud)

(与@Autowired/一起使用@Resource).但是为了给你一些建设性的建议:使用privatefield和getter而不是public staticfield 创建第二个类.

  • 对于"公共静态非最终领域是邪恶的",你能给我一些参考吗? (6认同)
  • 非final意味着你可以修改字段值,对于静态字段,这意味着处理线程并发 - 也就是堆栈中的痛苦. (4认同)
  • 仅供参考:以上代码会导致Sonar/Checkstyle违规(如果您对此类事情感到困扰),因为您有一个实例方法写入静态字段. (4认同)
  • 可以通过使用静态 setter 来模拟最终方面,该静态 setter 只会在当前为 null 时设置该值。因此,您只允许对该字段进行一次修改。(当然,这已被设为私有并使用 getter 来访问它)。Spring 可以在他的配置阶段(XML 或 Annotation)调用静态方法。 (2认同)