有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有Spring的java中央配置文件

我正在用Java11和Springboot2.1构建一个软件系统。我正在考虑配置选项,但到目前为止,我在Spring中发现的所有实现配置的方法都指向了其他方向。以下是我想要/需要的:

  1. 首先,我将有一些硬编码的配置值。它们不应该通过运行时加载的配置文件进行自适应

    • 示例:应用程序名
  2. 第二,我想要一个(内部)属性文件,用于配置值。这些(大部分)只能由开发人员编辑,因此在启动应用程序时可以作为标准值

    • 示例:应用程序版本
  3. 最后,将有一些配置值,用户应该在运行时使用一些UI编辑这些值

    • 示例:应用程序端口

现在,我想要一个中心配置文件,比如Singleton模式,它管理上面列出的所有三个类别的配置值。我的想法是,我可以轻松地从应用程序中的任何地方访问所有这些内容

理想情况下,我会有一个单例类,其中一个中心函数接受一个配置参数并返回相应的值

class MyConfig {
    private static singleton = null;
    private MyConfig() {}

    // needed: some name-value storage management for params
    // e.g.: some hardcoded values plus one or more linked property files.

    public static String getProperty(String paramName)
        // fetch parameter and return it
    }

    public static String getProperty(String paramName, String returnType)
        // fetch parameter and return it cast to the specified returnType
    }

    public static String setProperty(String paramName, String value)
        // persist property value to file
    }
}

启动应用程序时,配置基本上应该

  1. 将硬编码值加载到配置对象中(如果未在配置类本身中指定)
  2. 从属性文件加载值。
    • 必须检查加载的值的有效性(例如,应用程序端口是否为整数[165535])
    • 属性文件中的值必须预先注册,因此具有属性文件写入权限的用户不能通过添加新配置参数来“添加”该参数
    • 属性文件中的值不得覆盖硬编码的值

当用户在运行时编辑配置时,需要将相应的值写回属性文件(或存储它们的位置)

不幸的是,我没有发现类似的东西,我不知道如何获得Java属性和/或Spring属性/配置来实现类似的东西

谁能给我指出正确的方向或提供一个简单的工作示例


共 (1) 个答案

  1. # 1 楼答案

    您可以将MyConfig类构造函数中的属性文件中的属性加载到不可变映射中。将此不可变映射设置为类级属性,以便可以使用此属性访问所有属性

    class MyConfig {
        public static Map<String, String> immutableMap = null;
        private MyConfig() {
              Map<String,String> modifieableMap = new HashMap<>();
              //code to load properties into modifieableMap
              immutableMap = ImmutableMap.copyOf(mutableMap);
        }
    
        // needed: some name-value storage management for params
        // e.g.: some hardcoded values plus one or more linked property files.
    
        public static String getProperty(String paramName)
            // fetch parameter and return it
        }
    
        public static String getProperty(String paramName, String returnType)
            // fetch parameter and return it cast to the specified returnType
        }
    
        public static String setProperty(String paramName, String value)
            // persist property value to file
        }
    }
    

    如果用户试图从不可变映射中添加或删除任何属性,编译器将抛出UnsupportedOperationException异常