Java静态代码获取不到@value注入的值
静态代码执行的时候,spring是没有注入的,这个时候:
//错误的使用方法
@Value("${name}")
private static String name;
public static void test() {
String s = name;
System.out.println(s);
}
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
解决办法:
@Component
public class Properties {
@Value("${name}")
private String name;
public getName(){
return name;
}
}
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringContextUtil.applicationContext == null){
SpringContextUtil.applicationContext = applicationContext;
}
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
public static void test() {
Properties properties = SpringContextUtil.getBean(Properties.class);
String s = properties.getName();
System.out.println(s);//成功打印name值
}
使用springboot的同学,需要动态获取生产、测试、开发环境的,可以在pom文件里定义
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!--默认配置-->
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
在application.yml里配置,系统根据pom定义的profileActive(test)会找相应的application-test.yml文件
spring:
profiles:
active: @profileActive@
更多精彩

