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

Spring:如何向静态字段注入值?,spring,code-injection,Spring,Code Injection,跟这个班 @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 = pr

跟这个班

@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设置正确。这是不是好办法?如果没有,还有更好的方法吗?怎么做呢?

首先,公共静态非最终字段是有害的。由于某种原因,Spring不允许注入此类字段

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

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

使用@Autowired/@Resource。但是给你一些建设性的建议:用私有字段和getter而不是公共静态字段创建第二个类。

Spring在找到@value注释时使用依赖注入来填充特定的值。但是,不是将值传递给实例变量,而是传递给隐式setter。然后,这个setter处理NAME_静态值的填充

    @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;
    }
}

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

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;
    }
}

对于公共静态非最终字段是有害的,您能给我一些参考吗?非最终意味着您可以修改字段值,对于静态字段,这意味着处理线程并发性-也称为堆栈中的痛苦。如何将@value与静态块一起使用?请引导我们。。。NehaJust仅供参考:如果您对这类事情感到烦恼,那么上面的代码将导致Sonar/Checkstyle冲突,因为您有一个实例方法写入静态字段。可以通过使用静态设置器来模拟最后一个方面,该设置器只会在当前值为null时设置该值。因此,您只允许对字段进行一次修改。当然,它是私有的,并使用getter访问它。Spring可以在配置阶段调用静态方法XML或注释;如果在创建对象之前使用静态变量。e、 g如果在static块下使用静态变量来构造资源,那么资源将使用null来构造。