@PropertySource dengan YAML Files di Spring Boot

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kami akan menunjukkan cara membaca fail sifat YAML menggunakan anotasi @PropertySource di Spring Boot.

2. Format @PropertySource dan YAML

Spring Boot mempunyai sokongan hebat untuk konfigurasi luaran. Anda juga boleh menggunakan pelbagai cara dan format untuk membaca sifat-sifat dalam aplikasi Spring Boot di luar kotak.

Namun, secara lalai, @PropertySource tidak memuat fail YAML . Fakta ini dinyatakan secara eksplisit dalam dokumentasi rasmi.

Oleh itu, jika kita ingin menggunakan anotasi @PropertySource dalam aplikasi kita, kita perlu mengikuti fail sifat standard . Atau kita boleh melaksanakan sendiri potongan teka-teki!

3. Custom PropertySourceFactory

Mulai Spring 4.3, @PropertySource disertakan dengan atribut kilang . Kami dapat menggunakannya untuk menyediakan pelaksanaan khusus kami dari PropertySourceFactory , yang akan menangani pemprosesan fail YAML .

Ini lebih mudah daripada kedengarannya! Mari lihat bagaimana melakukan ini:

public class YamlPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource createPropertySource(String name, EncodedResource encodedResource) throws IOException { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(encodedResource.getResource()); Properties properties = factory.getObject(); return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties); } }

Seperti yang kita lihat, sudah cukup untuk menerapkan kaedah createPropertySource tunggal .

Dalam pelaksanaan khusus kami, pertama, kami menggunakan YamlPropertiesFactoryBean untuk menukar sumber dalam format YAML ke objek java.util.Properties .

Kemudian, kami hanya mengembalikan contoh baru PropertiesPropertySource , yang merupakan pembungkus yang membolehkan Spring membaca sifat yang dihuraikan.

4. @PropertySource dan YAML dalam Tindakan

Sekarang mari satukan semua kepingan dan lihat cara menggunakannya dalam praktik.

Pertama, mari buat fail YAML ringkas - foo.yml :

yaml: name: foo aliases: - abc - xyz

Seterusnya, mari buat kelas hartanah dengan @ConfigurationProperties dan gunakan YamlPropertySourceFactory tersuai kami :

@Configuration @ConfigurationProperties(prefix = "yaml") @PropertySource(value = "classpath:foo.yml", factory = YamlPropertySourceFactory.class) public class YamlFooProperties { private String name; private List aliases; // standard getter and setters }

Dan akhirnya, mari kita sahkan bahawa sifat disuntik dengan betul :

@RunWith(SpringRunner.class) @SpringBootTest public class YamlFooPropertiesIntegrationTest { @Autowired private YamlFooProperties yamlFooProperties; @Test public void whenFactoryProvidedThenYamlPropertiesInjected() { assertThat(yamlFooProperties.getName()).isEqualTo("foo"); assertThat(yamlFooProperties.getAliases()).containsExactly("abc", "xyz"); } }

5. Kesimpulan

Ringkasnya, dalam tutorial ringkas ini, kami pertama kali menunjukkan betapa mudahnya membuat PropertySourceFactory tersuai . Selepas itu, kami menyajikan cara menyampaikan pelaksanaan khusus ini ke @PropertySource menggunakan atribut kilang .

Oleh itu, kami berjaya memuatkan fail sifat YAML ke dalam aplikasi Spring Boot kami .

Seperti biasa, semua contoh kod boleh didapati di GitHub.