@Override
 public List<ConfigVo> findConfigVos(ConfigCriteria criteria) {
   int projectId = criteria.getProjectId();
   int envId = criteria.getEnvId();
   HasValueEnum hasValue =
       EnumUtils.fromEnumProperty(HasValueEnum.class, "value", criteria.getHasValue());
   List<Config> configs = configDao.findConfigByProject(projectId);
   List<ConfigVo> configVos = new ArrayList<ConfigVo>(configs.size());
   if (!configs.isEmpty()) {
     List<Integer> hasInstanceConfigs = configDao.findHasInstanceConfigs(projectId, envId);
     List<Integer> hasContextInstConfigs = configDao.findHasContextInstConfigs(projectId, envId);
     Map<Integer, ConfigInstance> defaultInsts = configDao.findDefaultInstance(projectId, envId);
     List<Integer> hasReferencedConfigs =
         isSharedProject(projectId)
             ? configDao.getProjectHasReferencedConfigs(projectId)
             : Collections.<Integer>emptyList();
     for (Config config : configs) {
       // 配置不会太多,使用内存过滤,无分页,如果配置太多影响到性能则考虑数据库过滤和分页
       String key = StringUtils.trim(criteria.getKey());
       String value = StringUtils.trim(criteria.getValue());
       ConfigInstance defaultInst = defaultInsts.get(config.getId());
       if ((StringUtils.isEmpty(key) || config.getKey().contains(key))
           && (hasValue == HasValueEnum.All
               || (hasValue == HasValueEnum.Yes && defaultInst != null)
               || (hasValue == HasValueEnum.No && defaultInst == null))
           && (StringUtils.isEmpty(value)
               || (defaultInst != null && defaultInst.getValue().contains(value)))) {
         configVos.add(
             new ConfigVo(
                 config,
                 hasInstanceConfigs.contains(config.getId()),
                 hasContextInstConfigs.contains(config.getId()),
                 hasReferencedConfigs.contains(config.getId()),
                 defaultInst));
       }
     }
   }
   return configVos;
 }
 @Override
 public List<Config> findConfigs(int projectId) {
   return configDao.findConfigByProject(projectId);
 }