【问题标题】:use properties from property files *AS* static final variables in java在 java 中使用属性文件 *AS* 静态最终变量中的属性
【发布时间】:2014-03-11 01:15:35
【问题描述】:

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

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

我在下面发布此解决方案以添加到 SO...的纲要中......

【问题讨论】:

  • 首先为您的问题添加更多详细信息。不要只是链接另一个问题。
  • 谢谢,我已将帖子编辑为更有问题:)

标签: java properties code-injection


【解决方案1】:

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

我相信,尽管我们都想追随函数式编程的热潮 并从我们的函数中删除所有“拉”依赖的概念,有一些事实是 需要绝对的基础,因此需要全局变量形式的一些事实来源 在运行时应用程序中实际上是有帮助的。但我不想发动火焰战争……

解决方案

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

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

    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);
    }
    

你有它。这将在加载 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);
    }
}

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 2019-02-24
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2021-06-07
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多