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


90

与这个班

@Component
public class Sample {

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


}

如果我尝试Sample.name,它始终为“ null”。所以我尝试了这个。

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设置正确。这是好方法吗?如果没有,还有什么更好的方法吗?以及如何做?


这不会解决;如果在创建对象之前使用了静态变量。例如)如果在静态块下使用静态变量来构造资源,则将使用null构造资源。
卡纳加维卢·苏古玛

Answers:


115

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

您的解决方法是有效的,甚至不需要getter / setter,private字段就足够了。另一方面,请尝试以下操作:

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

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


9
对于“公共静态非最终领域是邪恶的”,请给我一些参考吗?
Anderson

7
非最终意味着您可以修改字段值,对于静态字段,这意味着要处理线程并发-也就是栈中的痛苦。
Xavier Portebois,2015年

如何在静态块中使用@Value?请引导我们...问候,内

4
仅供参考:上面的代码将导致Sonar / Checkstyle违规(如果您对这种事情感到不安),因为您有一个实例方法写入静态字段。
尼尔

可以通过使用静态设置器来模仿最终方面,该设置器仅在当前为空时才设置该值。因此,您只允许对该字段进行一次修改。(当然已将其设为私有并使用getter进行访问)。Spring可以在配置阶段(XML或注释)调用静态方法。
Walfrat

0

这是我的加载静态变量的示例代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OnelinkConfig {
    public static int MODULE_CODE;
    public static int DEFAULT_PAGE;
    public static int DEFAULT_SIZE;

    @Autowired
    public void loadOnelinkConfig(@Value("${onelink.config.exception.module.code}") int code,
            @Value("${onelink.config.default.page}") int page, @Value("${onelink.config.default.size}") int size) {
        MODULE_CODE = code;
        DEFAULT_PAGE = page;
        DEFAULT_SIZE = size;
    }
}

-2

当找到@Value批注时,Spring使用依赖项注入来填充特定值。但是,不是将值传递给实例变量,而是将其传递给隐式设置器。然后,此设置器将处理我们的NAME_STATIC值。

    @RestController 
//or if you want to declare some specific use of the properties file then use
//@Configuration
//@PropertySource({"classpath:application-${youeEnvironment}.properties"})
public class PropertyController {

    @Value("${name}")//not necessary
    private String name;//not necessary

    private static String NAME_STATIC;

    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.