从多个 类 访问 Java 配置
Accessing Java configuration from multiple classes
我正在探索在 Java 中进行简单、普通的基于文件的配置的方法。我查看了 Java 的内置 Properties
和 Apache 通用配置库。对于后者,提炼代码如下:
Configurations configs = new Configurations();
Configuration config = null;
try
{
config = configs.properties(new File("config.properties"));
}
catch (ConfigurationException cex)
{
}
long loadQPS = config.getInt("loadQPS");
我遇到的问题是我发现自己在每个 class 中都插入了这个,这至少有两个原因是次优的:1) 我每 [=32] 读取一次文件=],而我应该只读一次。 2)代码重复。
一个明显的解决方案是创建一个单例配置 class,然后我可以从每个其他 class 访问它。但可以肯定的是,这几乎是每个用例中都需要的功能,所以它不应该包含在配置库本身中吗(我是否遗漏了什么)?我也想到了使用Spring配置,可以为我创建一个Singleton配置class,但是仅仅基于文件的配置不会有太多的开销吗? (据我了解,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
在包中访问。
所以你有几个选择。一种简单的方法是静态存储和访问 Configuration 对象。
当我想要没有 Spring 的依赖注入时,我喜欢的另一个方法是以 DI 友好的方式构建程序。您可以通过将 main() 函数转换为最终启动它的程序的 "configuration" 来模拟 DI 容器。
考虑一个典型的多层 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();
}
}
这个 main() 是 "wire up" 您的应用程序的中心位置,因此很容易将您的 Configuration 对象传递给需要它的每个组件。
我正在探索在 Java 中进行简单、普通的基于文件的配置的方法。我查看了 Java 的内置 Properties
和 Apache 通用配置库。对于后者,提炼代码如下:
Configurations configs = new Configurations();
Configuration config = null;
try
{
config = configs.properties(new File("config.properties"));
}
catch (ConfigurationException cex)
{
}
long loadQPS = config.getInt("loadQPS");
我遇到的问题是我发现自己在每个 class 中都插入了这个,这至少有两个原因是次优的:1) 我每 [=32] 读取一次文件=],而我应该只读一次。 2)代码重复。
一个明显的解决方案是创建一个单例配置 class,然后我可以从每个其他 class 访问它。但可以肯定的是,这几乎是每个用例中都需要的功能,所以它不应该包含在配置库本身中吗(我是否遗漏了什么)?我也想到了使用Spring配置,可以为我创建一个Singleton配置class,但是仅仅基于文件的配置不会有太多的开销吗? (据我了解,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
在包中访问。
所以你有几个选择。一种简单的方法是静态存储和访问 Configuration 对象。
当我想要没有 Spring 的依赖注入时,我喜欢的另一个方法是以 DI 友好的方式构建程序。您可以通过将 main() 函数转换为最终启动它的程序的 "configuration" 来模拟 DI 容器。
考虑一个典型的多层 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();
}
}
这个 main() 是 "wire up" 您的应用程序的中心位置,因此很容易将您的 Configuration 对象传递给需要它的每个组件。