Spring 加载项目外部配置文件
程序员文章站
2024-01-05 15:10:40
背景 在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题: 1. 即使是配置文件修改,也还需要整个项目重新打包和部署。 2. 整个项目只有一套环境,不能切换。 针对上面的问题,可以使用外部化配置来解决。 需求 由于服务器上的应用服务器存放路径未知,只知应用服务器的目录结构 ......
背景
在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题:
- 即使是配置文件修改,也还需要整个项目重新打包和部署。
- 整个项目只有一套环境,不能切换。
针对上面的问题,可以使用外部化配置来解决。
需求
由于服务器上的应用服务器存放路径未知,只知应用服务器的目录结构。所以需要通过文件的相对路径,实现外部化配置。
环境
- jdk6
- spring 3.2.5
方案
file
不建议使用 file 的相对路径来获取,因为以下两点:
- file 的相对目录会随着启动的目录变化而变化。
- file 不能够获取 jar 包中的配置文件。
class
可以使用 getclass().getresource
或者 getclass().getresourceasstream
来获取,可以获取到 jar 包中的文件。
- 如果文件路径以“/”开头,表示获取classpath路径下的文件。
- 不以“/”开头,获取和当前类同一目录下的文件。
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); }