能否将application.properties值注入Java类静态变量并在静态方法中使用?
能不能在Java中实现你要的功能?
直接按你写的代码来是行不通的,得先修正几个问题:
先解决代码里的语法错误
- 把
Stringp[]改成String[],这是拼写失误 retrun要修正为returnif语句要补全括号语法,而且方法必须有默认返回值,否则编译无法通过
修正基础语法后的代码示例:
public class myClass { @Value("${myString}") private static String myString; static String myStaticMethod(final String[] args) { if (args.length > 0) { return args[0] + myString; } return ""; // 补充默认返回值 } }
最核心的问题:@Value注入静态字段
Spring的@Value注解默认无法直接注入静态字段,因为Spring的依赖注入是针对类的实例对象的,静态字段属于类本身,不属于任何实例。要实现静态字段的注入,可以用下面两种方法:
方法1:通过实例setter方法赋值静态字段
写一个非静态的setter方法,给静态字段赋值,再给这个setter添加@Value注解:
public class myClass { private static String myString; @Value("${myString}") public void setMyString(String myString) { myClass.myString = myString; } static String myStaticMethod(final String[] args) { if (args.length > 0) { return args[0] + myString; } return ""; } }
方法2:用@PostConstruct初始化静态字段
如果myClass是Spring管理的Bean(比如添加了@Component注解),可以在实例方法里通过@PostConstruct把注入的实例字段赋值给静态字段:
@Component public class myClass { @Value("${myString}") private String instanceMyString; private static String myString; @PostConstruct public void init() { myString = instanceMyString; } static String myStaticMethod(final String[] args) { if (args.length > 0) { return args[0] + myString; } return ""; } }
另外要注意:只有当myClass被Spring容器管理(比如标注@Component、@Service这类注解),@Value才会生效,否则注解不会被Spring处理,myString会一直是null。
内容的提问来源于stack exchange,提问作者lalala
相关产品推荐
相关产品推荐

