spring-boot yaml配置独立

时间:2015-03-27 04:59:02

标签: spring spring-boot snakeyaml

是否可以在spring-boot应用程序之外利用Spring-Boot的YAML配置?即我们可以只使用YAML配置功能添加spring-boot依赖吗?

我的用例是一个小型实用程序项目,需要配置和YAML方法。如果我将它连接到主项目(这是一个Spring-Boot应用程序),一切都很好。但是如果我想单独测试这个实用程序项目(简单的java-app),它就不会将配置连接起来。有什么想法吗?可能是我在这里缺少一些基本的东西。

下面的示例代码段。以下包是组件扫描的一部分。

@Component
@ConfigurationProperties(prefix="my.profile")
public class TestConfig {

    private List<String> items;

    public List<String> getItems() {
        return items;
    }

    public void setItems(List<String> items) {
        this.items = items;
    }
}

YAML配置

my:
    profile:
        items:
            - item1
            - item2

1 个答案:

答案 0 :(得分:0)

键是 YamlPropertiesFactoryBean,正如前面提到的 M. Deinum

import org.springframework.beans.factory.config.YamlProcessor;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
import org.springframework.core.io.ClassPathResource;

import java.util.Properties;

public class PropertyLoader {

    private static Properties properties;
    
    private PropertyLoader() {}

    public static Properties load(String... activeProfiles) {
        if (properties == null) {
            YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(new ClassPathResource("application.yml"));
            factory.setDocumentMatchers((profile) -> YamlProcessor.MatchStatus.FOUND); // TODO filter on active profiles
            factory.afterPropertiesSet();
            
            properties = factory.getObject();
        }
        return properties;
    }

    public static <T> T value(String property, Class<T> target) {
        load();
        ConfigurationPropertySource propertySource = new MapConfigurationPropertySource(properties);
        Binder binder = new Binder(propertySource);
        return binder.bind(property.toLowerCase(), target).get();
    }
}

PropertyLoader#value 然后可以像这样使用:

List<String> items = PropertyLoader.value("my.profile.items", List.class);