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

时间:2011-03-11 03:11:11

标签: java configuration instance-variables

管理和分配不同类类型的许多不同类实例(在Java中)的配置的首选方法是什么?

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

我想允许有多个Application实例,每个Application实例都有关联的Configuration。这是我迷失了......我唯一的选择是将Configuration引用级联到其他所有类(通过构造函数和setter)吗?或者还有另一种方式吗?

看起来像Application实例的单一配置,并且它的所有支持实例都不合理,但是级联单一配置引用的要求似乎就是这样的负担。

谢谢, Chenz

3 个答案:

答案 0 :(得分:2)

听起来你刚刚发现你所认为的全球状态并不是真正的全球化。

有几种解决方案,

  1. 你概述的那个,
  2. 使用像Guice这样的依赖注入框架来进行范围配置。
  3. 使用ClassLoader voodoo在同一个VM中创建多个“全局”配置。
  4. 最好的解决方案是通过手动或通过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

如果上述情况都不成立,那你就有点紧张......