我有一个提供配置数据的spring服务。当GUI调用服务时,它会从数据库加载配置数据。事实证明,这在渲染单个请求期间经常发生。我想通过缓存配置数据来优化它。但是,我不确定这是一个好的编程风格,还是“允许”在服务中拥有一个实例变量。
以下是我正在考虑的一些示例代码:
@Serivce("MyConfigService")
public class MyConfigServiceImpl implements MyConfigService {
private Config cachedConfig;
@Override
public Config loadConfig() {
if (cachedConfig != null) {
// load config
cachedConfig = loadedConfig;
}
return cachedConfig;
}
@Override
public saveConfig(Config config) {
cachedConfig = null;
// save the configuration
}
}
答案 0 :(得分:4)
拥有一个实例变量(不受spring管理)会导致服务变为线程不安全的可能性。所以我尽量避免它们,或者确保它们是线程安全的。
您可能需要查看@configurable
和@postconstuct
注释才能实现目标。
答案 1 :(得分:2)
Spring服务层类中是否允许实例变量?肯定。
使用一个来保存对Config
对象的引用是不是一个好主意?
也许,也许不是。
您没有显示Config
通常如何加载...是否会向所有用户返回相同的Config
实例? ie - 当User1调用saveConfig
时,User2调用loadConfig
User2获取Config
对象User1已保存。
如果是这样,您应该能够毫无问题地缓存该值。
此外,您可以使用Spring的annotation-based caching。
,而不是自己实现它答案 2 :(得分:0)
实例变量就是Spring IoC容器的全部内容;你的设计中可疑的是你在loadConfig
中拥有自己的延迟加载逻辑 - 这是你必须通过lazy-init=true
(或类似的,我不记得确切)留给Spring的关注点。该设计还可能涉及查找方法和明确的请求范围的bean。