You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC Web应用主数据存储位置咨询:属性文件或数据库存储至作用域?

嘿,这个问题得结合你的主数据特性和业务需求来选方案,我给你拆解两种常见的做法,还有各自的适用场景:

方案1:属性文件存储(适合静态、不常变更的主数据)

如果像货币代码这类数据,短期内不会频繁新增/修改,而且数量不多,用属性文件是个简单高效的选择:

  • 把主数据放在专门的属性文件里,比如master-data.properties,格式可以是:
    currency.codes=INR,USD,EUR,GBP
    
  • 在Spring中通过@PropertySource加载这个文件,再封装成一个可复用的Bean:
    @Component
    @PropertySource("classpath:master-data.properties")
    public class MasterDataHolder {
        @Value("#{'${currency.codes}'.split(',')}")
        private List<String> currencyCodes;
    
        public List<String> getCurrencyCodes() {
            return Collections.unmodifiableList(currencyCodes);
        }
    }
    
  • 在JSP页面中,直接通过Spring EL调用这个Bean,配合JSTL和表单Bean的数据做比对,比如:
    <c:if test="${not empty formBean.currencyCode && masterDataHolder.currencyCodes.contains(formBean.currencyCode)}">
        <span>有效的货币代码</span>
    </c:if>
    
方案2:数据库存储+缓存到作用域(适合动态、需维护的主数据)

如果你的主数据需要频繁新增/修改(比如后续要加后台管理界面来维护货币代码),那数据库存储是更合适的选择:

  • 先建一张主数据表,比如currency,包含code、name等字段
  • 编写Repository接口获取所有货币代码,比如用Spring Data JPA:
    public interface CurrencyRepository extends JpaRepository<Currency, String> {
        List<String> findAllByCode();
    }
    
  • 把数据缓存到应用作用域(Application),避免重复查询数据库:
    • 可以在启动时通过@PostConstruct加载:
      @Component
      public class ApplicationDataLoader {
          @Autowired
          private CurrencyRepository currencyRepo;
      
          @Autowired
          private ServletContext servletContext;
      
          @PostConstruct
          public void loadMasterData() {
              List<String> currencyCodes = currencyRepo.findAllByCode();
              servletContext.setAttribute("currencyCodes", currencyCodes);
          }
      }
      
    • 如果数据会变更,可以加定时刷新逻辑,或者提供后台接口手动刷新缓存
  • 在JSP中直接从应用作用域取数据做比对:
    <c:if test="${not empty formBean.currencyCode && applicationScope.currencyCodes.contains(formBean.currencyCode)}">
        <span>有效的货币代码</span>
    </c:if>
    
额外的最佳实践
  • 不管用哪种方案,都建议在后端也做验证,比如用Spring的自定义校验注解,避免前端绕过验证直接提交非法数据
  • 如果是非常核心的主数据(比如货币代码),可以考虑用Java枚举类来约束,类型更安全:
    public enum CurrencyCode {
        INR, USD, EUR;
    
        public static boolean isValid(String code) {
            try {
                CurrencyCode.valueOf(code);
                return true;
            } catch (IllegalArgumentException e) {
                return false;
            }
        }
    }
    
    这样在后端验证时直接调用CurrencyCode.isValid(formBean.getCurrencyCode())即可。

内容的提问来源于stack exchange,提问作者Swapneel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:47:27