无需触摸构造函数,添加专用字段或设置器
那不是依赖注入模式。您可能会替换资源定位器模式,但做得好(特别是在保持可测试性的方式上)并非易事:使用 setter,我可以轻松地重新配置被测类。如果该类依赖于配置文件,每当我需要更改单元测试的设置时,我会编写一个单独的配置文件吗?我会模拟配置类吗?可能,但不完全直截了当......
能够自动生成属性文件模板
正如评论中已经指出的那样,这似乎不是很有用,因为它无法迁移旧的配置文件。
能够在运行时以线程安全的方式更新配置
这通常需要正在配置的组件的支持(例如,更改线程池大小的设置涉及启动/停止工作线程......)。一般来说,处理这个问题的唯一简单方法是重新启动应用程序......
如果您放弃这些要求,Spring 的PropertyOverrideConfigurer就非常适合。
或者,如果您在 servlet 容器中运行,您可以使用JNDI 查找来填充您的 Spring 配置。
如果你真的想生成模板,我不知道一个现成的解决方案。我可能会做类似的事情:
class Configuration {
int threadCount = 10;
String secretKey;
@Description("Number of workers. Default value is number of available cores.")
int workerThreadCount = Runtime.getRuntime().availableProcessors();
/** Use default settings */
Configuration() {
}
/** read the settings from the file */
Configuration(Properties props) {
for (String prop : props) {
Field f = getClass().getField(prop);
f.set(this, props.getValue(prop));
// TODO: type conversion,
// e.g. with PropertyEditors,
// or Spring's ConversionService,
// or invoking the constructor that takes a single string argument,
// or ...
}
}
void save() {
for (Field f : getClass().getFields()) {
// TODO save the setting
}
}
}
编写默认配置将是一个简单的 as new Configuration().save(file)
,或升级现有配置,如 `new Configuration(file).save(file)' 一样简单。
与您的方法不同,这种方法是静态类型安全的,并且不会使访问具有冗余类型说明符的配置设置的代码混乱。也就是说,而不是
if(config.value(Prop.PROXY_ENABLED,Boolean.class)){
你可以简单地写
if (config.proxyEnabled) {
并且因为该字段可以是布尔类型(不是布尔类型),所以您甚至不会在这里冒 NullPointerException 的风险。