许多内部解决方案浮现在脑海中。就像在数据库中拥有属性并每 N 秒轮询一次。然后还要检查 .properties 文件的时间戳修改并重新加载它。
但是我一直在查看 Java EE 标准和 spring boot 文档,但我似乎找不到一些最好的方法。
我需要我的应用程序读取属性文件(或环境变量或数据库参数),然后能够重新读取它们。生产中使用的最佳实践是什么?
一个正确的答案至少会解决一个场景(Spring Boot 或 Java EE)并提供一个关于如何让它在另一个场景上工作的概念线索
原文由 David Hofmann 发布,翻译遵循 CC BY-SA 4.0 许可协议
经过进一步研究, 必须仔细考虑重载属性。例如,在 Spring 中,我们可以毫无问题地重新加载属性的“当前”值。但。在上下文初始化时根据 application.properties 文件中存在的值(例如数据源、连接池、队列等)初始化资源时,必须特别小心。
注意:
用于 Spring 和 Java EE 的抽象类并不是干净代码的最佳示例。但它易于使用,并且确实满足了以下基本初始要求:
对于春季启动
此代码有助于在不使用 Spring Cloud Config 服务器的情况下热重载 application.properties 文件(这对于某些用例来说可能有点矫枉过正)
您可以复制和粘贴这个抽象类(好东西:D)这 是从这个 SO answer 派生的代码
然后创建一个 bean 类,允许从使用抽象类的 applicatoin.properties 检索属性值
确保将 @EnableScheduling 添加到您的 @SpringBootApplication
现在您可以在任何需要的地方 自动 连接 AppProperties Bean。只要确保 始终 调用其中的方法而不是将其值保存在变量中即可。并确保重新配置使用可能不同的属性值初始化的任何资源或 bean。
目前,我只使用外部和默认找到的
./config/application.properties
文件对此进行了测试。对于 Java EE
我制作了一个通用的 Java SE 抽象类来完成这项工作。
你可以复制粘贴这个:
然后你可以这样使用它:
如果您想使用编码属性,您可以将其值包含在 ENC() 中,并且将在属性文件的相同路径和名称中搜索用于解密的密码,并添加 .key 扩展名。在此示例中,它将在 application.properties.key 文件中查找密码。
应用程序.properties ->
应用程序.properties.key ->
对于 Java EE 解决方案的属性值加密,我参考了 Patrick Favre-Bulle 关于 在 Java 和 Android 中使用 AES 进行对称加密的 优秀文章。然后在这个关于 AES/GCM/NoPadding 的 SO 问题中检查密码、块模式和填充。最后,我使 AES 位源自@erickson 在 SO about AES Password Based Encryption 中的出色答案的密码。关于 Spring 中值属性的加密,我认为它们与 Java Simplified Encryption 集成在一起
这是否符合最佳实践条件可能超出范围。这个答案展示了如何在 Spring Boot 和 Java EE 中拥有可重新加载的属性。