1. Ikhtisar
Dalam tutorial singkat ini, kami akan menunjukkan cara membaca file properti YAML menggunakan anotasi @PropertySource di Spring Boot.
2. @PropertySource dan Format YAML
Spring Boot memiliki dukungan yang bagus untuk konfigurasi eksternal. Juga, dimungkinkan untuk menggunakan berbagai cara dan format untuk membaca properti di aplikasi Spring Boot out-of-the-box.
Namun, secara default, @PropertySource tidak memuat file YAML . Fakta ini secara eksplisit disebutkan dalam dokumentasi resmi.
Jadi, jika kita ingin menggunakan anotasi @PropertySource dalam aplikasi kita, kita harus tetap menggunakan file properti standar . Atau kita bisa menerapkan sendiri potongan puzzle yang hilang!
3. Custom PropertySourceFactory
Mulai Musim Semi 4.3, @PropertySource dilengkapi dengan atribut pabrik . Kita bisa memanfaatkannya untuk menyediakan implementasi kustom kita dari PropertySourceFactory , yang akan menangani pemrosesan file YAML .
Ini lebih mudah dari kedengarannya! Mari kita 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 bisa kita lihat, itu cukup dengan mengimplementasikan satu metode createPropertySource .
Dalam implementasi kustom kami, pertama, kami menggunakan YamlPropertiesFactoryBean untuk mengonversi sumber daya dalam format YAML ke objek java.util.Properties .
Kemudian, kami hanya mengembalikan instance baru PropertiesPropertySource , yang merupakan pembungkus yang memungkinkan Spring membaca properti yang diurai.
4. @PropertySource dan YAML dalam Aksi
Sekarang mari kita gabungkan semua bagian dan lihat bagaimana menggunakannya dalam praktik.
Pertama, mari buat file YAML sederhana - foo.yml :
yaml: name: foo aliases: - abc - xyz
Selanjutnya, mari buat kelas properti dengan @ConfigurationProperties dan gunakan YamlPropertySourceFactory kustom 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 terakhir, mari verifikasi bahwa properti diinjeksi dengan benar :
@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
Singkatnya, dalam tutorial singkat ini, pertama-tama kami menunjukkan betapa mudahnya membuat PropertySourceFactory kustom . Setelah itu, kami mempresentasikan cara meneruskan implementasi kustom ini ke @PropertySource menggunakan atribut pabriknya .
Akibatnya, kami berhasil memuat file properti YAML ke aplikasi Spring Boot kami .
Seperti biasa, semua contoh kode tersedia di GitHub.