Как использовать YamlPropertiesFactoryBean для загрузки файлов YAML с помощью Spring Framework 4.1?

У меня есть приложение spring, которое в настоящее время использует *.файлы свойств, и я хочу, чтобы он использовал файлы YAML вместо этого.

Я нашел класс YamlPropertiesFactoryBean это, кажется, способно сделать то, что мне нужно.

моя проблема в том, что я не уверен, как использовать этот класс в моем приложении Spring (которое использует конфигурацию на основе аннотаций). Кажется, я должен настроить его в PropertySourcesPlaceholderConfigurer С the setBeanFactory метод.

ранее я загружал файлы свойств с помощью @PropertySource следующим образом:

@Configuration
@PropertySource("classpath:/default.properties")
public class PropertiesConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

Как включить YamlPropertiesFactoryBean в PropertySourcesPlaceholderConfigurer, чтобы я мог загружать файлы YAML напрямую? Или есть другой способ сделать это?

спасибо.

мое приложение использует конфигурацию на основе аннотаций, и я использую Spring Framework 4.1.4. Я нашел несколько информация, но она всегда указывала мне на Spring Boot, как этот.

2 ответов


с конфигурацией XML я использую эту конструкцию:

<context:annotation-config/>

<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
    <property name="resources" value="classpath:test.yml"/>
</bean>

<context:property-placeholder properties-ref="yamlProperties"/>

конечно, у вас должна быть зависимость snakeyaml от вашего пути к классам среды выполнения.

Я предпочитаю конфигурацию XML над конфигурацией java, но я recon, это не должно быть трудно преобразовать его.

edit:
в Java-config для полноты картины

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
  PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
  YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
  yaml.setResources(new ClassPathResource("default.yml"));
  propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
  return propertySourcesPlaceholderConfigurer;
}

читать .YML-файл весной вы можете использовать следующий подход.

например, у вас есть это .файл yml:

section1:
  key1: "value1"
  key2: "value2"
section2:
  key1: "value1"
  key2: "value2"

затем определите 2 Java POJOs:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "section1")
public class MyCustomSection1 {
    private String key1;
    private String key2;

    // define setters and getters.
}

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "section2")
public class MyCustomSection1 {
    private String key1;
    private String key2;

    // define setters and getters.
}

теперь вы можете autowire эти бобы в вашем компоненте. Например:

@Component
public class MyPropertiesAggregator {

    @Autowired
    private MyCustomSection1 section;
}

если вы используете Spring Boot, все будет автоматически сканироваться и создаваться:

@SpringBootApplication
public class MainBootApplication {
     public static void main(String[] args) {
        new SpringApplicationBuilder()
            .sources(MainBootApplication.class)
            .bannerMode(OFF)
            .run(args);
     }
}

если вы используете JUnit, есть базовая тестовая установка для загрузки YAML файл:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(MainBootApplication.class)
public class MyJUnitTests {
    ...
}

если вы используете TestNG, есть образец тестовой конфигурации:

@SpringApplicationConfiguration(MainBootApplication.class)
public abstract class BaseITTest extends AbstractTestNGSpringContextTests {
    ....
}