Suntik Peta dari Fail YAML dengan Spring

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melihat bagaimana cara menyuntik peta dari fail YAML di Spring Boot .

Pertama, kita akan mulakan dengan sedikit pandangan mengenai fail YAML dalam Spring Framework. Kemudian, kami akan mempamerkan, melalui contoh praktikal, cara mengikat sifat YAML ke Peta .

2. Fail YAML dalam Spring Framework

Menggunakan fail YAML untuk menyimpan data konfigurasi luaran adalah amalan biasa di kalangan pembangun Spring. Pada dasarnya, Spring menyokong dokumen YAML sebagai alternatif kepada harta tanah dan menggunakan SnakeYAML di bawah tudung untuk menguraikannya .

Tanpa basa-basi lagi, mari kita lihat seperti apa fail YAML biasa:

server: port: 8090 application: name: myapplication url: //myapplication.com

Seperti yang dapat kita lihat, fail YAML sangat jelas dan lebih mudah dibaca oleh manusia. Sebenarnya, YAML menyediakan cara yang menarik dan ringkas untuk menyimpan data konfigurasi hierarki.

Secara lalai, Spring Boot membaca sifat konfigurasi dari application.properties atau application.yml pada permulaan aplikasi. Namun, kami dapat menggunakan @PropertySource untuk memuatkan fail YAML tersuai.

Sekarang kita sudah biasa dengan apa itu fail YAML, mari kita lihat cara menyuntik sifat YAML sebagai Peta di Spring Boot.

3. Cara Menyuntik Peta dari Fail YAML

Spring Boot telah membawa eksternalisasi data ke tahap seterusnya dengan memberikan anotasi berguna yang disebut @ConfigurationProperties. Anotasi ini diperkenalkan untuk menyuntik sifat luaran dengan mudah dari fail konfigurasi terus ke objek Java .

Pada bahagian ini, kita akan membahas secara mendalam cara mengikat sifat YAML ke dalam kelas kacang menggunakan anotasi @ConfigurationProperties .

Pertama, mari tentukan beberapa sifat nilai kunci dalam application.yml :

server: application: name: InjectMapFromYAML url: //injectmapfromyaml.dev description: How To Inject a map from a YAML File in Spring Boot config: ips: - 10.10.10.10 - 10.10.10.11 - 10.10.10.12 - 10.10.10.13 filesystem: - /dev/root - /dev/md2 - /dev/md4 users: root: username: root password: rootpass guest: username: guest password: guestpass

Dalam contoh ini, kami akan cuba memetakan aplikasi ke dalam Peta ringkas . Begitu juga, kami akan memasukkan maklumat konfigurasi sebagai Peta , dan pengguna sebagai Peta dengan kekunci String dan objek milik kelas yang ditentukan pengguna - Kredensial - sebagai nilai .

Kedua, mari buat kelas kacang - ServerProperties - untuk merangkumi logik mengikat sifat konfigurasi kami ke Peta s:

@Component @ConfigurationProperties(prefix = "server") public class ServerProperties { private Map application; private Map
    
      config; private Map users; // getters and setters public static class Credential { private String username; private String password; // getters and setters } }
    

Seperti yang kita lihat, kita menghiasi kelas ServerProperties dengan @ConfigurationProperties. Dengan cara itu, kami memberitahu Spring untuk memetakan semua sifat dengan awalan yang ditentukan untuk objek ServerProperties .

Ingatlah bahawa aplikasi kita juga perlu diaktifkan untuk sifat konfigurasi, walaupun ini dilakukan secara automatik di kebanyakan aplikasi Spring Boot.

Akhirnya, mari kita uji apakah sifat YAML kita disuntik dengan betul sebagai Peta s:

@RunWith(SpringRunner.class) @SpringBootTest class MapFromYamlIntegrationTest { @Autowired private ServerProperties serverProperties; @Test public void whenYamlFileProvidedThenInjectSimpleMap() { assertThat(serverProperties.getApplication()) .containsOnlyKeys("name", "url", "description"); assertThat(serverProperties.getApplication() .get("name")).isEqualTo("InjectMapFromYAML"); } @Test public void whenYamlFileProvidedThenInjectComplexMap() { assertThat(serverProperties.getConfig()).hasSize(2); assertThat(serverProperties.getConfig() .get("ips") .get(0)).isEqualTo("10.10.10.10"); assertThat(serverProperties.getUsers() .get("root") .getUsername()).isEqualTo("root"); } }

4. @ConfigurationProperties vs @Value

Sekarang mari kita buat perbandingan pantas @ConfigurationProperties dan @Value.

Walaupun kedua-dua anotasi dapat digunakan untuk menyuntik sifat dari fail konfigurasi , ia sangat berbeza. Perbezaan utama antara dua anotasi ini adalah masing-masing mempunyai tujuan yang berbeza.

Pendek kata, @V Alue membolehkan kita untuk menyuntik langsung harta tertentu nilai dengan utamanya. Walau bagaimanapun, anotasi @ConfigurationProperties mengikat banyak sifat ke objek tertentu dan memberikan akses ke sifat melalui objek yang dipetakan.

Secara umum, Spring mengesyorkan menggunakan @ConfigurationProperties over @Value ketika menyuntik data konfigurasi . @ConfigurationProperties menawarkan cara terbaik untuk memusatkan dan mengelompokkan sifat konfigurasi dalam objek berstruktur yang dapat kita suntik kemudian ke kacang lain.

5. Kesimpulan

Ringkasnya, kami pertama kali menerangkan cara menyuntik Peta dari fail YAML di Spring Boot. Kemudian, kami menyoroti perbezaan antara @ConfigurationProperties dan @Value.

Seperti biasa, kod sumber lengkap untuk artikel tersebut terdapat di GitHub.