管理配置并将其分发到不同类类型(Java 中)的许多不同类实例的首选方法是什么?
换句话说,我有一个 Application 类,它将配置选项存储在静态变量的 Configuration 类中。这允许应用程序中的所有其他类只需调用 Application.config 来获取配置值。
我希望允许每个应用程序实例有多个具有关联配置的应用程序实例。这是我迷失的地方...是我将配置引用级联到每个其他类(通过构造函数和 setter )的唯一选择吗?或者还有其他办法吗?
似乎应用程序实例及其所有支持实例的单个配置并非不合理,但级联单个配置引用的要求似乎是一个负担。
谢谢, 陈兹
最佳答案
听起来您刚刚发现您认为的全局状态并不是真正的全局。
有几种解决方案,
- 您概述的那个,
- 使用像 Guice 这样的依赖注入(inject)框架来进行范围配置。
- 使用
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/