java - 管理配置并将其分发到不同类类型(Java 中)的许多不同类实例的首选方法是什么?

标签 java configuration instance-variables

管理配置并将其分发到不同类类型(Java 中)的许多不同类实例的首选方法是什么?

换句话说,我有一个 Application 类,它将配置选项存储在静态变量的 Configuration 类中。这允许应用程序中的所有其他类只需调用 Application.config 来获取配置值。

我希望允许每个应用程序实例有多个具有关联配置的应用程序实例。这是我迷失的地方...是我将配置引用级联到每个其他类(通过构造函数和 setter )的唯一选择吗?或者还有其他办法吗?

似乎应用程序实例及其所有支持实例的单个配置并非不合理,但级联单个配置引用的要求似乎是一个负担。

谢谢, 陈兹

最佳答案

听起来您刚刚发现您认为的全局状态并不是真正的全局。

有几种解决方案,

  1. 您概述的那个,
  2. 使用像 Guice 这样的依赖注入(inject)框架来进行范围配置。
  3. 使用 ClassLoader voodoo 在同一虚拟机中创建多个“全局”配置。

最好的解决方案实际上是手动或通过 DI 来线程配置,但由于您要求其他选项,第三个解决方案是更改您的 main 类以创建 UrlClassLoader 指向您的 jar 的应用程序的每个实例。这允许您在同一虚拟机中并排拥有多个不同版本的 Application 类及其关联的 Condiguration 类。

编辑:

要执行类加载器巫毒,您的 main 看起来像这样

URLClassLoader application1Loader = new ClassLoader(/* URLs to common Jars and the config files for instance 1*/);
URLClassLoader application2Loader = new ClassLoader(/* URLs to common Jars and the config files for instance 2*/);

// Assuming you have a wrapper for your application that you can run() to get it going
// in its own thread via reflection.

Class<? extends Runnable> app1Class = application1Loader.loadClass("my.pkg.MyApplicaion")
    .asSubclass(Runnable.class);
// newInstance() is problematic but I want this code to be brief.
app1Class.newInstance().run();

Class<? extends Runnable> app2Class = application2Loader.loadClass("my.pkg.MyApplicaion")
    .asSubclass(Runnable.class);
app2Class.newInstance().run();

更新:my.pkg.MyApplicaion 类不得位于 JVM 的类路径中。

关于java - 管理配置并将其分发到不同类类型(Java 中)的许多不同类实例的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268562/

相关文章:

Android 静态变量作用域和生命周期

java - 如何为 SOAPBody 添加子节点?

php - 如何基于 TreeBuilder 对象动态构建表单?

java - 为什么 Servlet 中的实例变量不是线程安全的

php - 如何在 Nginx 配置文件中配置 Phalcon

c# - 在共享文件夹中部署 Microsoft 应用程序 block

Java 实例化类以允许动态字段

java - 使用 Gson 添加现有的 json 字符串

Java 编程错误 : java. util.ConcurrentModificationException

java - 在 Java 中打开 WIth 对话框