如何使用YamlPropertiesFactoryBean使用Spring Framework 4.1加载YAML文件?

2022-09-01 01:25:31

我有一个当前使用*.properties文件的spring应用程序,我想用YAML文件来使用它。

我发现YamlPropertiesFactoryBean类似乎能够做我需要的事情。

我的问题是我不确定如何在我的Spring应用程序中使用这个类(它使用基于注释的配置)。看来我应该在 PropertySourcesPlaceholderConfigurer 中使用 setBeanFactory 方法配置它。

以前,我使用@PropertySource加载属性文件,如下所示:

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

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

如何在 PropertySourcesPlaceholderConfigurer 中启用 YamlPropertiesFactoryBean,以便我可以直接加载 YAML 文件?还是有另一种方法可以做到这一点?

谢谢。

我的应用程序使用基于注释的配置,我使用的是Spring Framework 4.1.4。我找到了一些信息,但它总是指向Spring Boot,就像这个一样


答案 1

使用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配置,但是我侦察它不应该很难转换它。

编辑:
java配置,为了完整性

@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;
}

答案 2

`

package com.yaml.yamlsample;

import com.yaml.yamlsample.config.factory.YamlPropertySourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

@SpringBootApplication
@PropertySource(value = "classpath:My-Yaml-Example-File.yml", factory = YamlPropertySourceFactory.class)
public class YamlSampleApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(YamlSampleApplication.class, args);
    }

    @Value("${person.firstName}")
    private String firstName;
    @Override
    public void run(String... args) throws Exception {
        System.out.println("first Name              :" + firstName);
    }
}


package com.yaml.yamlsample.config.factory;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import java.io.IOException;
import java.util.List;

public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
    @Override
    public PropertySource createPropertySource(String name, EncodedResource resource) throws IOException {
         if (resource == null) {
            return super.createPropertySource(name, resource);
        }
        List<PropertySource<?>> propertySourceList = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
        if (!propertySourceList.isEmpty()) {
            return propertySourceList.iterator().next();
        }
        return super.createPropertySource(name, resource);
    }
}

My-Yaml-Example-File.yml

person:
  firstName: Mahmoud
  middleName:Ahmed

在 github spring-boot-yaml-sample 上引用我的例子,这样你就可以加载 yaml 文件并使用 @Value() 注入值


推荐