如何配置自定义源以提供Spring Boot的@ConfigurationProperties

时间:2016-05-27 00:01:04

标签: spring spring-boot

我是Spring Boot的新手,并阅读了有关@ConfigurationProperties注释如何在没有@Value注释的情况下自动注入字段值的内容。

@Configuration
@ConfigurationProperties(locations = "classpath:some.properties", prefix = "something")
public class MyConfiguration { .. }

我想使用Groovy的ConfigSlurper来阅读我的属性配置。有没有办法将@ConfigurationProperties与自定义属性阅读器关联,可能是Spring类的自定义扩展,它处理ConfigSlurper?或者有没有办法用不同的功能模拟相同的行为?

2 个答案:

答案 0 :(得分:4)

这不是@ConfigurationProperties的意图。 @ConfigurationProperties绑定Environment中可用的任何内容。 locations属性在1.4中已弃用,将在以后的版本中删除。

您的想法是指定一个前缀,如果它们是与环境中的前缀匹配的键,我们会在您的POJO中注入相关属性。如果您想要使用此机制的基础结构,请删除{{1} }注释的属性并使用您自己的属性源更新环境。另一个答案为您提供了一种方法,您可以使用locations将您的实现挂钩到环境中。

答案 1 :(得分:3)

您可以通过实施自己的PropertySourceLoader

来实现
public class ConfigSlurperPropertySourceLoader implements PropertySourceLoader {

    @Override
    public String[] getFileExtensions() {
        return new String[] { "groovy" };
    }

    @Override
    public PropertySource<?> load(String name, Resource resource, String profile) throws IOException {
        ConfigObject source = new ConfigSlurper(profile).parse(resource.getURL());
        return new ConfigObjectPropertySource(name, source);
    }
}

PropertySource<T>扩展为从ConfigObject(上面的ConfigObjectPropertySource)读取值。然后在META-INF/spring.factories内注册:

# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.example.ConfigSlurperPropertySourceLoader,\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader

spring-groovy-config已经实现了它,并且可用on github