是否允许在Spring Services中包含实例变量?

时间:2013-02-22 12:47:33

标签: java spring service

我有一个提供配置数据的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
    }
}

3 个答案:

答案 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。