zoukankan      html  css  js  c++  java
  • 关于springboot配置文件的另类读取方法

    一、背景故事

       前阵子我接手了公司另外一个同事手里的项目,项目是用的springboot 写的,但是比较坑的就是这个项目写的有点不伦不类。虽然是用的springboot,但由于他是拿了一堆代码拼凑起来的,估计他没去研究springboot的常规设置,所以用了一个很直接的办法,把所有配置信息都塞到application.properties文件里面,然后不同环境的配置文件用起来每次都把application文件覆盖掉。然后在代码里载入application.properties文件,来作为读取配置文件的公共静态方法。

      我刚接手代码的时候只是发现配置文件各种混乱,也没多想,上来就把配置文件全部整理了一遍。整理完后,我就尝试启动服务,发现各种报错,配置文件读取错误。我一惊,翻了代码才发现上面说的大坑。那么下面我就记录下我自己某度了好久,才想到的改动最小的办法。原谅我水平不是太高。

    二、代码

      1.首先是原先的读取配置文件的公共方法。

    public class ConfigUtil {
        /**
         * 日志.
         */
        private static Logger logger = Logger.getLogger(ConfigUtil.class);
    
        // 初始化配置文件
        private static Properties pro = new Properties();
        static {
            final Resource resource = new ClassPathResource(
                    "/META-INF/properties/application.properties");
            InputStream ips = null;
            try {
                ips = resource.getInputStream();
                pro.load(ips);
            } catch (final IOException e) {
                logger.info(e.getMessage());
            } finally {// QKX 20131223关闭输入流
                try {
                    if (ips != null) {
                        ips.close();
                    }
                } catch (final IOException e) {
                    logger.info(e.getMessage());
                }
    
            }
        }
    
        // 获取配置文件的中配置的值
        public static String getValue(final String key) {
            return pro.getProperty(key).trim();
        }
    }
    View Code

      这样的问题就在于我把配置文件拆成这种形式的时候,他还是只能读取到application.properties中的属性,读取不了其他的。

      

      2.由于项目已经上过线了,所以想尽量少改动,所以我就思考只改这个公共方法,不要动其他业务的代码。于是就变成了下面的样子。

    @Component
    public class ConfigUtil {
    
        @Autowired
        private Environment env;
    
        private static Environment staticEnv;
    
        @PostConstruct
        public void init() {
    
            staticEnv = env;
        }
    
        // 获取配置文件的中配置的值
        public static String getValue(final String key) {
    
            return staticEnv.getProperty(key).trim();
        }
    }
    View Code

      3.这样确实能够读取配置文件,但是有一个问题,就是在这个bean被加载之前,这个方法还是无效的。具体的顺序你们看自己对应的项目,我这里就只有主类中的一些bean和一个队列线程。那么这里我就用@Value注解来读取相关属性就解决了。

  • 相关阅读:
    LeetCode 811. Subdomain Visit Count (子域名访问计数)
    LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
    LeetCode 939. Minimum Area Rectangle (最小面积矩形)
    LeetCode 781. Rabbits in Forest (森林中的兔子)
    LeetCode 739. Daily Temperatures (每日温度)
    三种方式实现按钮的点击事件
    239. Sliding Window Maximum
    14.TCP的坚持定时器和保活定时器
    13.TCP的超时与重传
    12.TCP的成块数据流
  • 原文地址:https://www.cnblogs.com/Oliver-rebirth/p/springboot_config.html
Copyright © 2011-2022 走看看