1. 程式人生 > >Java靜態代碼獲取不到@value註入的值

Java靜態代碼獲取不到@value註入的值

get app prope div ext default 獲取 def over

靜態代碼執行的時候,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: @[email protected]

  

Java靜態代碼獲取不到@value註入的值