4

我有一个提供配置数据的弹簧服务。当 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
    }
}
4

3 回答 3

4

拥有一个实例变量(不是由 spring 管理的)引入了服务变得线程不安全的可能性。所以我尽量避免它们,或者确保它们是线程安全的。

您可能希望查看@configurable@postconstuct注释以实现您的目标。

于 2013-02-22T13:21:36.940 回答
2

Spring服务层类中是否允许实例变量?当然。

在这里使用一个来保存对Config对象的引用是个好主意吗?

也许,也许不是。

您没有显示Config正常加载的方式...是否将同一Config实例返回给所有用户?即 - 当用户 1 调用saveConfig然后用户 2 调用loadConfig用户 2 获取Config对象用户 1 保存。

如果是这样,您应该能够毫无问题地缓存该值。

此外,您可以使用 Spring 的基于注释的缓存,而不是自己实现它。

于 2013-02-22T13:15:49.263 回答
0

实例变量是 Spring IoC 容器的全部内容;您的设计中值得怀疑的是您有自己的延迟加载逻辑loadConfig- 这是您必须留给 Spring 的关注点lazy-init=true(或类似的,我不记得确切)。该设计还可能涉及查找方法和可能的请求范围 bean。

于 2013-02-22T13:00:40.583 回答