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来构造。