1. 程式人生 > >Spring中動態獲取配置檔案中的值(properties, 或者yml)

Spring中動態獲取配置檔案中的值(properties, 或者yml)

平時我們都習慣用@Value("${"XXXX"}")註解標註在成員變數上來獲取,但是如果說沒有配置則連繫統都啟動不了

所以我寫了一個工具類可以在程式執行期間動態獲取配置檔案中的值:

直接上工具類:

package com.zz.amqp1.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.stereotype.Component;
import org.springframework.util.StringValueResolver;

/**
 * Description: Spring程式碼形式注入bean
 * User: zhouzhou
 * Date: 2018-09-07
 * Time: 11:36
 */
@Component
public class SpringContextUtil implements ApplicationContextAware ,EmbeddedValueResolverAware {

    private static Logger logger = LoggerFactory.getLogger(SpringContextUtil.class);

    // Spring應用上下文環境
    private static ApplicationContext applicationContext;

    private static StringValueResolver stringValueResolver;

    /**
     * 實現ApplicationContextAware介面的回撥方法。設定上下文環境
     *
     * @param applicationContext
     */
    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 獲取物件
     *
     * @param name
     * @return Object
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }


    /**
     * 動態獲取配置檔案中的值
     * @param name
     * @return
     */
    public static String getPropertiesValue(String name) {
        try {
            name = "${" + name + "}";
            return stringValueResolver.resolveStringValue(name);
        } catch (Exception e) {
            logger.error(String.format("當前環境變數中沒有{%s}的配置", name));
            // 獲取失敗則返回null
            return null;
        }
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {
        this.stringValueResolver = stringValueResolver;
    }
}

如何使用呢??

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringContextUtilTest {

    @Test
    public void test(){
        String userId = SpringContextUtil.getPropertiesValue("userId");
        System.out.println(userId);
    }
}

當我們配置的時候則會列印,讓我們分別用有的,和沒有的配置檔案做測試配置檔案如下:

# 測試userId
 userId: 123測試

和空

結果如下