靜態代碼執行的時候,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@
