欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring 加载项目外部配置文件

程序员文章站 2022-04-14 18:55:56
背景 在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题: 1. 即使是配置文件修改,也还需要整个项目重新打包和部署。 2. 整个项目只有一套环境,不能切换。 针对上面的问题,可以使用外部化配置来解决。 需求 由于服务器上的应用服务器存放路径未知,只知应用服务器的目录结构 ......

背景

在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题:

  1. 即使是配置文件修改,也还需要整个项目重新打包和部署。
  2. 整个项目只有一套环境,不能切换。

针对上面的问题,可以使用外部化配置来解决。

需求

由于服务器上的应用服务器存放路径未知,只知应用服务器的目录结构。所以需要通过文件的相对路径,实现外部化配置。

环境

  1. jdk6
  2. spring 3.2.5

方案

file

不建议使用 file 的相对路径来获取,因为以下两点:

  1. file 的相对目录会随着启动的目录变化而变化。
  2. file 不能够获取 jar 包中的配置文件。

class

可以使用 getclass().getresource 或者 getclass().getresourceasstream 来获取,可以获取到 jar 包中的文件。

  1. 如果文件路径以“/”开头,表示获取classpath路径下的文件。
  2. 不以“/”开头,获取和当前类同一目录下的文件。

classloader

classloader 和 class 类似,区别是 classloader 以“/”开头返回null,并且相对路径是获取 classpath 下的文件。

实现

最终选择使用 classloader 来实现较为简单,部分实现。

inputstream is = getclass().getclassloader().getresourceasstream(external_config_file);

if (is == null) {
    logger.info("外部配置不存在。");
}
try {
        encodedresource resource = new encodedresource(new inputstreamresource(is), "utf-8");
        resourcepropertysource propertysource = new resourcepropertysource(resource);
        //外部化配置的优先级最高
        beanfactory.getbean(standardenvironment.class).getpropertysources().addfirst(propertysource);

} catch (ioexception e) {

    logger.error("获取外部配置失败。", e);
}