静态代码执行的时候,spring是没有注入的,这个时候:
//错误的使用方法 @Value("${name}") private static String name; public static void test() { String s = name; System.out.println(s); }
解决办法:
@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@
原文:https://www.cnblogs.com/wochenjun/p/10698313.html