使用属性文件中的属性* AS中的AS *静态最终变量

时间:2014-03-11 01:15:35

标签: java properties code-injection

如何使用属性文件在我的应用程序中存储全局变量,还可以使用公共静态最终变量将它们注入应用程序?

看一下this question,我希望找到一种方法,我可以从属性文件中将静态最终变量注入应用程序。我感到很失望,但最终发现了一种方法,我可以吃蛋糕并吃掉它。

我在下面发布这个解决方案,以添加到SO的纲要......

1 个答案:

答案 0 :(得分:4)

我的解决方案涉及全局变量(which are apparently bad)的概念, 所以,如果你不是佯攻,那么请继续阅读。

我相信,虽然我们希望所有人都遵循功能性编程热潮 并从我们的函数中删除所有“拉”依赖的概念,有一些事实 需要绝对的基础,因此需要全局变量形式的一些事实来源 在运行时应用程序中实际上很有用。但我不想开始一场火焰战......

解决方案

  1. 从一个名为Globals的公共类开始(或类似的东西)

  2. 要从属性文件中注入属性,您需要建立该属性的基本名称(或位置) 属性文件,例如"com.example.myapp.core.configuration"可能代表配置 文件在您的核心模块中,物理网址为jar:file:C:/jars/myapp.ear/core.jar!/com/example/myapp/core/configuration.properties。 将此basename设为静态最终变量:

    public static final String CORE_CONFIGURATION_BASENAME = "com.example.myapp.core.configuration";
    
  3. 然后将属性键定义为私有变量(用于封装),例如

    private static final String DOMAIN_PACKAGE_KEY = "myapp.domain.package.name";
    
  4. 然后将属性自己定义为公共最终静态变量,如下所示:

    public static final String DOMAIN_PACKAGE; //we leave it uninitialized on purpose.
    
  5. 上面的代码在构建时会抛出编译错误,所以我们需要使用静态块初始化它。 要做到这一点,我们必须首先使用我们定义的基本名称检索资源包:

    static {
        ResourceBundle bundle = PropertyResourceBundle(CORE_CONFIGURATION_BASENAME);
        ...
    }
    
  6. 然后我们使用我们定义的键分配最终属性:“

    static {
        ResourceBundle bundle = PropertyResourceBundle(CORE_CONFIGURATION_BASENAME);
        DOMAIN_PACKAGE = bundle.getString(DOMAIN_PACKAGE_KEY);
    }
    
  7. 你有它。这将在加载Globals类时初始化,因此如果您更改配置属性 使用这些值并希望它们反映在您的应用程序中,您需要重新启动应用程序以强制类加载器重新加载 上课。

    现在:

    package com.example.myapp.core.util;
    
    import java.util.PropertyResourceBundle;
    import java.util.ResourceBundle;
    
    public class Globals {
        public static final String CORE_CONFIGURATION_BASENAME = "com.example.myapp.core.configuration";
        private static final String DOMAIN_PACKAGE_KEY = "myapp.domain.package.name";
        public static final String DOMAIN_PACKAGE; //we leave it uninitialized on purpose.
    
        static {
            ResourceBundle bundle = PropertyResourceBundle(CORE_CONFIGURATION_BASENAME);
            DOMAIN_PACKAGE = bundle.getString(DOMAIN_PACKAGE_KEY);
        }
    }