JAVA项目启动后读取上下文中的配置文件属性值工具类

176 阅读1分钟

可能有人会想springBoot读取配置文件的方式不都有了吗,不管@Value注解或者Environment都可以获取到配置文件信息。何必大费周章自己搞个工具类。
不晓得有没有同学遇到过这些场景,在一个没有被spring管理的类里使用容器中的bean对象,是没办法是通过注解去依赖注入的,只能通过自定义ApplicationContext工具通过调用getBean方法获取。
同样的在没有被spring管理的类里是没办法使用注解的,所以就需要我们自己去实现一个工具类

工具类如下:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;


public class PropertyConfigurer extends PropertyPlaceholderConfigurer {
    private static Map<String, String> propertyMap;

    @Override
    protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
        super.processProperties(beanFactoryToProcess, props);
        propertyMap = new HashMap<>();
        for (Object key : props.keySet()) {
            String keyStr = key.toString();
            String value = props.getProperty(keyStr);
            propertyMap.put(keyStr, value);
        }
    }

    private static void check(String key) throws IllegalArgumentException {
        if (!containsKey(key)) {
            throw new IllegalArgumentException("not configured: " + key);
        }
    }


    /**
     * 判断属性名是否存在
     * @param key
     * @return
     */
    public static boolean containsKey(String key) {
        return propertyMap.containsKey(key);
    }


    /**
     * 根据属性名获取字符串类型属性值
     * @param name
     * @return
     */
    @SuppressWarnings("unchecked")
    public static String getString(String name) {
        check(name);
        return propertyMap.get(name);
    }


    /**
     * 根据属性名获取数字类型属性值
     * @param name
     * @return
     */
    public static Integer getInt(String name) {
        return Integer.parseInt(getString(name));
    }


    /**
     * 根据属性名获取布尔类型属性值
     * @param name
     * @return
     */
    public static Boolean getBoolean(String name) {
        return Boolean.parseBoolean(getString(name));
    }

    /**
     * 根据属性名获取指定类型属性值
     * @param name
     * @param defaultValue
     * @return
     * @param <T>
     */
    @SuppressWarnings("unchecked")
    public static <T> T getProperty(String name, T defaultValue) {
        if (propertyMap.containsKey(name)) {
            return (T) propertyMap.get(name);
        } else {
            return defaultValue;
        }
    }

}