2014-08-27 170 views
0

我有一个java web应用程序,需要在初始化时从外部文件读取信息(即:当jboss服务器启动时)。什么是初始化加载变量的最佳做法

由于阅读和解析这个文本文件是一个昂贵的操作,我们决定只加载它一次,然后将其设置为内存,以便可以在任何地方访问(变量不需要在initialitazion后修改)。

我在任何地方都看过应该避免使用全局变量,那么这种情况下的最佳做法是什么?

编辑:我应该提到这些信息应该存储在一个简单的List变量中。

+2

其实我觉得这是不同的东西。配置文件不应只读取一次。如果你可以改变它并且服务器再次读取并执行最小化停机时间的改变,那将会更好。这与使用全局变量完全不同,任何方法和类都可以更改,但无法追踪。全局只读变量(如常量)并不差。他们很好。 :-) – Leo 2014-08-27 20:00:06

+0

如果您有Web应用程序的属性,请考虑使用JNDI定义它们。战争中的属性文件可以很好地定义可以被覆盖的静态值或属性,但是定义任何类型的配置并不好。 JNDI将允许您以动态方式在外部定义属性。 – 2014-08-27 20:00:30

+0

@Leo我会说这是一个全局只读变量,它只在初始化时设置一次。 – 2014-08-27 20:02:42

回答

1

全局可访问的静态配置对象很常见。你可以使用Singleton-Pattern来访问配置。这可能是这样的:

public class Config { 
    private static Config myInstance; 

    private Config() { 
     // Load the properties 
    } 

    public static getInstance() { 
     if (myInstance == null) { 
      myInstance = new Config(); 
     } 

     return myInstance; 
    } 

    public String getConfigPropertyBla() 

    ... 
} 

如果你使用Spring,你可以让弹簧负荷特性的豆。然后,您可以通过自动装配在应用程序中的任何地方访问Bean。我个人认为,这是一个非常好的解决方案。

+0

这不是一个配置文件但你的答案解决了我的问题。谢谢。 – 2014-08-27 20:03:58

+0

这是一个单身人士。这是您正在阅读的关于不是最佳实践的模式。 – 2014-08-27 20:05:28

+0

@Daniel Calderon Mori不客气。如果这解决了您的问题,您是否介意点击已解决的符号? – treeno 2014-08-27 20:08:06

0

DI,IoC容器。看看Guice,非常好。

2

它强烈依赖于您使用的框架。一般而言,你是对的,全局变量通常被视为反模式。但是你必须了解其中的原因,主要是可测试性。

为了让“全局”事情得到测试,您通常会使用像工厂,提供程序这样的模式,并经常与依赖注入(例如Spring,Guide)结合使用。

最后你正在缓存。为了缓存,你也可以使用EHCache之类的框架。但也许这对你来说是很大的开销。

为了保持它的简单和普通的Java,我建议这样的事情(只是初稿,未测试):

public class FileCache { 
    Map<String, String> fileContents = new HashMap<String, String>(); 

    public void loadFile(String path) { 
     if (fileContents.contains(path)) { 
     return fileContents.get(path); 
     } 

     // Loading logic 
     String content = loadContentOfFile(path); 
     fileContents.put(path, content); 
     return content; 
    } 
} 

有了这个,你让你的缓存位可扩展性(可以缓存尽可能多的文件如你所愿),这将是很容易测试这个类。但最终你会得到一些你需要访问这个课程的地方。

然后你要么有依赖注入,一个静态变量或一些单身。 对于单身人士,你应该保持简单,因为它再次难以测试。

public class FileContentProvider { 
    private static FileContentProvider instance; 
    private final FileCache fileCache = new FileCache(); 

    public static FileContentProvider getInstance() { 
     if (instance == null) { 
      instance = new FileContentProvider(); 
     } 
     return instance; 
    } 

    public FileCache getFileCache() { 
     return fileCache; 
    } 

}

相关问题