java - 在 java 中使用属性文件 *AS* static final 变量中的属性

标签 java properties code-injection

如何使用属性文件在我的应用程序中存储全局变量,同时使用 public static final 变量将它们注入(inject)到应用程序中?

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

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

最佳答案

我的解决方案涉及全局变量的概念 ( which are apparently bad ), 因此,如果您不是胆小鬼,请继续阅读。

我相信尽管我们都希望追随函数式编程的热潮 并从我们的函数中删除所有“拉取”依赖项的概念,有一些事实 需要绝对基础,因此需要一些全局变量形式的真​​实来源 在运行时应用程序中实际上很有帮助。但我不想开始一场口水战...

解决方案

  1. 从一个名为 Globals 的公共(public)类开始(或类似这样的明显名称)

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

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

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

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

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

    static {
        ResourceBundle bundle = PropertyResourceBundle(CORE_CONFIGURATION_BASENAME);
        DOMAIN_PACKAGE = bundle.getString(DOMAIN_PACKAGE_KEY);
    }
    

就是这样。这将在加载 Globals 类时初始化,因此如果您更改配置属性 使用这些值并希望它们反射(reflect)在您的应用程序中,您将需要重新启动应用程序以强制类加载器重新加载 类。

现在:

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

关于java - 在 java 中使用属性文件 *AS* static final 变量中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22314582/

相关文章:

java - 使用 MinGW gcj 编译 java 代码时出错

java - 在没有 for 循环的 Java 中乘法数组

objective-c - 延迟加载具有 int 属性的 Objective-C 类

iphone - 如果我使用 self.fooBar 而不是 fooBar,性能会有所不同吗?

javascript - 使 Javascript 代码黑客攻击/注入(inject)/操纵变得困难的方法?

c - 如何将 c 函数注入(inject)或动态加载到另一个 c 程序中

css - 一种阻止富媒体(Flash)广告更改页面上的 CSS 元素的方法?

java - 仅适用于 S3 的 AWS 开发工具包

java - 文本溢出 : ellipsis is not working in jsf selectOneMenu and also in SelectItem

javascript - 为什么这个可配置属性不可删除?