gpt4 book ai didi

java - 如何构建我自己的应用程序设置

转载 作者:行者123 更新时间:2023-12-01 05:56:09 24 4
gpt4 key购买 nike

我想为我的应用程序构建一个ApplicationSettingApplicationSetting 可以存储在属性文件或数据库表中。设置存储在键值对中。例如

ftp.host = blade
ftp.username = dummy
ftp.pass = pass
content.row_pagination = 20
content.title = How to train your dragon.

我的设计如下:

应用程序设置阅读器:

    interface IApplicationSettingReader {
Map read();
}

DatabaseApplicationSettingReader implements IApplicationSettingReader {
dao appSettingDao;

Map read() {
List<AppSettingEntity> listEntity = appSettingsDao.findAll();
Map<String, String> map = new HaspMap<String, String>();
foreach (AppSettingEntity entity : listEntity) {
map.put(entity.getConfigName(), entity.getConfigValue());
}

return new AppSettings(map);
}
}

DatabaseApplicationSettingReader implements IApplicationSettingReader {
dao appSettingDao;

Map read() {
//read from some properties file
return new AppSettings(map);
}
}

应用程序设置类:

AppSettings {
private static AppSettings instance = new AppSettings();
private Map map;

private AppSettings() {
}



public static AppSettings getInstance() {
if (instance == null) {
throw new RuntimeException("Object not configure yet");
}

return instance;
}

public static configure(IApplicationSettingReader reader) {
this.map = reader.read();

}

public String getFtpSetting(String param) {
return map.get("ftp." + param);
}

public String getContentSetting(String param) {
return map.get("content." + param);
}

}

测试类:

AppSettingsTest {
IApplicationSettingReader reader;

@Before
public void setUp() throws Exception {
reader = new DatabaseApplicationSettingReader();
}

@Test
public void getContentSetting_should_get_content_title() {
AppSettings.configure(reader);

Instance settings = AppSettings.getInstance();
String title = settings.getContentSetting("title");
assertNotNull(title);
Sysout(title);
}

}

我的问题是:

  1. 你能对我的代码发表一下意见吗?有什么问题吗???

  2. 我配置应用程序设置一次,在应用程序启动时,我使用适当的读取器(DbReaderPropertiesReader)配置应用程序设置,将其设置为单例因为应用程序只有一个 ApplicationSettngs 实例。问题是,当某些用户直接编辑数据库或文件到数据库或文件时,我无法获取更改后的值。现在,我想实现类似 ApplicationSettingChangeListener 的东西。因此,如果数据发生变化,我将刷新我的应用程序设置。您对如何实现这一点有什么建议吗????

最佳答案

我还没有彻底检查你的代码,但似乎存在并发问题。该映射是线程不安全的(HashMap),因此如果您通过 config() 对其进行变异并让其他线程访问映射,则会出现问题。

虽然您可以使用 ConcurrentHashMap 代替 HashMap,但 ConcurrentHashMap 上的批处理操作不是原子的。这意味着,如果您使用它,您将看到“半途”修改的配置。根据您的应用程序,这可能不行。

因此,解决方案是使用这个:

private volatile ImmutableMap map;

public config(){
ImmutableMap newMap = createNewMap();
this.map = newMap;
}

这将自动更改您的配置(没有中间状态可见)。

至于动态更新配置,log4j 使用监视配置文件的后台线程来完成此操作。当然,您可以通过定期轮询来监视数据库表。

在这种情况下,您的 Config 类最好有一个 ScheduledExecutor,其任务将监视文件/数据库并定期调用 config()。

关于java - 如何构建我自己的应用程序设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2886597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com