管理和分配不同类类型的许多不同类实例(在Java中)的配置的首选方法是什么?
换句话说,我有一个Application类,它在一个静态变量的Configuration类中存储配置选项。这允许应用程序中的所有其他类简单地调用Application.config来获取配置值。
我想允许有多个Application实例,每个Application实例都有关联的Configuration。这是我迷失了......我唯一的选择是将Configuration引用级联到其他所有类(通过构造函数和setter)吗?或者还有另一种方式吗?
看起来像Application实例的单一配置,并且它的所有支持实例都不合理,但是级联单一配置引用的要求似乎就是这样的负担。
谢谢, Chenz
答案 0 :(得分:2)
听起来你刚刚发现你所认为的全球状态并不是真正的全球化。
有几种解决方案,
ClassLoader
voodoo在同一个VM中创建多个“全局”配置。最好的解决方案是通过手动或通过DI来配置您的配置,但是由于您要求其他选项,第三种解决方案是更改您的main
类以创建每个实例UrlClassLoader
指向您的罐子的应用程序。这允许您在同一个VM中并排拥有多个不同版本的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的类路径中。
答案 1 :(得分:0)
我通常使用Spring并在相关的XML文件中定义我的配置,我使用spring API将其加载到任何需要的位置。
在不重写所有API的情况下传递app config的快速而肮脏的方法是使用单例模式。您可以使用AppConfig.getInstance()获取对配置的引用。
答案 2 :(得分:0)
如果你的对象知道它们属于哪个应用程序,没问题:只需使配置成为非静态的。
如果您的Application实例是单独的线程,没问题:在ThreadLocal上放置配置
如果某个命名空间与每个Application相关联,并且子对象知道它,没问题:在某处存储静态Map
如果上述情况都不成立,那你就有点紧张......