关于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(); } }
这样的问题就在于我把配置文件拆成这种形式的时候,他还是只能读取到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(); } }
3.这样确实能够读取配置文件,但是有一个问题,就是在这个bean被加载之前,这个方法还是无效的。具体的顺序你们看自己对应的项目,我这里就只有主类中的一些bean和一个队列线程。那么这里我就用@Value注解来读取相关属性就解决了。