Spring 4 - 检索所有属性

时间:2015-07-15 07:52:43

标签: spring properties-file

我想返回Spring应用程序中使用的所有属性的Map。我在SO中发现了几个与此类似的问题但与特定属性文件有关,而我想获得所有属性。

属性应仅适用于当前应用程序 - 不适用于运行时的任何其他部分。

1 个答案:

答案 0 :(得分:0)

我提出了以下解决方案。

请注意,这里的技巧是要包含或排除的内容。我可以根据属性文件路径的一些常见部分选择包含,但在这种情况下,我选择排除eclipse,gradle和jre属性。

我最初排除了项目,但在部署到Tomcat时发现我不得不开始排除更多项目。相反,我根据项目名称更改为包含(始终包含公司名称)。代码已更改以反映此情况。

这也有一小部分Java lambda代码(双用户),但必要时可以很容易地重写。

public Map<String, Object> getProperties() throws IOException {
    if (props != null) {
        return props;
    }
    props = new HashMap<>();
    List<String> includeResourcesSubstringList = Arrays.asList(new String[] { "the_company" });

    PropertiesFactoryBean propsFactory = new PropertiesFactoryBean();
    PathMatchingResourcePatternResolver resResolver = new PathMatchingResourcePatternResolver(
            this.getClass().getClassLoader());
    Resource[] resources = resResolver.getResources("classpath*:/**/*");
    List<Resource> filteredResources = new ArrayList<>();
    logger.debug("Exclude resources containing: " + includeResourcesSubstringList);
    for (Resource res : resources) {
        if (res.getFilename().endsWith(".properties")) {
            logger.debug("Res item to inspect: " + res.getDescription());
            boolean includeItem = false;
            for (String include : includeResourcesSubstringList) {
                if (res.getURI() != null && res.getURI().toASCIIString().contains(include)) {
                    includeItem = true;
                    break;
                }
            }
            if (includeItem) {
                logger.debug("getProperties() - Included resource: " + res.getDescription());
                filteredResources.add(res);
            }
        }
    }
    propsFactory.setLocations(filteredResources.toArray(new Resource[0]));
    propsFactory.afterPropertiesSet();
    Properties properties = propsFactory.getObject();
    properties.forEach((key, value) -> {
        props.put((String) key, value);
    });

    return props;
}