无需指定环境变量/系统属性即可将 Spring Boot 配置拆分为多个属性文件的任何方法

Posted

技术标签:

【中文标题】无需指定环境变量/系统属性即可将 Spring Boot 配置拆分为多个属性文件的任何方法【英文标题】:Any way to split Spring Boot configuration into multiple properties files without having to specify an environment variable/system property 【发布时间】:2020-06-18 10:32:49 【问题描述】:

这里是 Spring Boot 新手,不过是 Spring 框架的老用户。

我正在寻找一种方法将我的外部化配置拆分为多个 .properties 文件,以提高可读性和可管理性。

我已经看到this SO answer:能够在spring.config.name 中指定配置文件名列表(顺便说一下,在引导参考文档中似乎没有提到,如果我是,请纠正我错误)将完美地解决我的问题,但是只能通过系统属性或环境变量指定配置属性。如果我尝试在我的 application.properties 文件中指定它,它会被忽略。 spring.config.additional-location 也是如此。我理解会发生这种情况,因为当读取 application.properties 时,告诉 Spring Boot 搜索不同的外部化配置文件名称为时已晚。然而,这不是一个合适的解决方案,因为我拆分配置的方式应该是我的应用程序的消费者不应该知道的“实施细节”,所以我不希望消费者指定外部参数,否则我的应用程序开箱即用。

我认为应该提供一种方法来做到这一点。也许.properties 文件的一些导入机制或即使在application.properties 中指定spring.config.name 的能力(一些已知和合理的限制是可以接受的)。

我能找到的最好的方法是使用@PropertySource,但这不知道配置文件:除非您使用一些ugly nested class hack,或者您使用put spring.profiles.active variable in the resource name(如果激活了多个配置文件,则会中断),您赢了application.properties profile-specific files 不会获得您所拥有的好处。

除了Spring Boot devs 的一些声明说他们宁愿提倡使用单个(可能是巨大的......)外部化配置文件外,我无法找到“官方方式”来做到这一点。从 GitHub 上的帖子反应来看,这个职位似乎不太受欢迎,恕我直言,这似乎是一个基本功能缺失。多年来,我一直在使用 Spring Framework 中的多个属性文件(使用 XML 配置),但我从来没有觉得只有一个大文件会更好。

如果我理解正确,在 Boot 1.x 中,这在某种程度上可以使用 @ConfigurationPropertieslocation 属性,但在 Boot 2.x 中却没有。

有什么建议吗?

【问题讨论】:

【参考方案1】:

您是否尝试过使用 Spring Profile?

你可以做的是创建application-file1.properties/ymlapplication-file2.properties/yml并将其放在配置位置,然后添加spring.profile.active=<your env profiles>,file1,file2。 它将加载文件。

对于 Pivotal Cloud Foundry,此配置文件条目可以在 bootstrap.ymlJVM args to application 中,在 Manifest-<env>.yml 中。不确定 AWS 和其他云提供商。

希望这会有所帮助。

【讨论】:

正如我在问题中所写,分析支持是可取的,但与将配置拆分为不同的 .properties 文件的需求正交。 @PropertySource 的问题确实在于它不能很好地与配置文件配合使用。

以上是关于无需指定环境变量/系统属性即可将 Spring Boot 配置拆分为多个属性文件的任何方法的主要内容,如果未能解决你的问题,请参考以下文章

无需单击按钮即可将数据从一个文本字段传输到另一个文本字段

如何配置Spring的环境变量

如何在 Spring 测试中设置环境变量或系统属性?

无需输入即可将数据从 Web 应用程序获取到客户端计算机上特定文件夹中的 XML 文件中的方法

无需卡即可将图像分享到 Twitter

无需 youtube 应用即可将 Youtube 视频集成到应用中