代码之家  ›  专栏  ›  技术社区  ›  flow2k

从多个类访问Java配置

  •  2
  • flow2k  · 技术社区  · 6 年前

    Properties

    Configurations configs = new Configurations();
    Configuration config = null;
    try
    {
        config = configs.properties(new File("config.properties"));
    }
    catch (ConfigurationException cex)
    {
    }
    
    long loadQPS = config.getInt("loadQPS");
    

    我的问题是,我发现自己在每个类中都插入了这个,这是次优的,至少有两个原因:1)每个类我读一次文件,而我应该只读一次。2) 代码重复。

    一个明显的解决方案是创建一个单例配置类,然后从其他每个类访问该类。但这肯定是几乎所有用例中都需要的特性,所以它不应该包含在配置库中吗(我遗漏了什么吗)?我还考虑过使用Spring配置,它可以为我创建一个单例配置类,但是仅仅基于文件的配置不会有太多开销吗?(据我所知,春天的力量在于DI。)

    什么是好的解决方案或最佳实践(如果有的话)?

    编辑 :答案中建议的简单静态解决方案:

    public class ConfigClass {
    
        static Configuration config;
    
        static {
            Configurations configs = new Configurations();
    
            Logger sysLogger = LoggerFactory.getLogger("sysLogger");
            try
            {
                config = configs.properties(new File("config.properties"));
            }
            catch (ConfigurationException cex)
            {
                sysLogger.error("Config file read error");
            }
        }
    }
    

    包中的访问方式 ConfigClass.config .

    1 回复  |  直到 6 年前
        1
  •  3
  •   jeff    6 年前

    所以你有几个选择。一个简单的方法是静态地存储和访问配置对象。

    考虑一个典型的多层web应用程序:DI友好的main()方法可能如下所示:

    public class AddressBookApp {
      public static void main(String[] args) {
        Configuration conf = new Configuration(args[0]);
    
        // Creates our Repository, this might do some internal JDBC initialization
        AddressBookRepository repo = new AddressBookRepository(conf);
    
        // Pass the Repository to our Service object so that it can persist data
        AddressBookService service = new AddressBookService(repo);
    
        // Pass the Service to the web controller so it can invoke business logic
        AddressBookController controller = new AddressBookController(conf, service);
    
        // Now launch it! 
        new WebApp(new Controller[] { controller }).start();
      }
    }