Injizieren Sie eine Karte aus einer YAML-Datei mit Spring

1. Übersicht

In diesem kurzen Tutorial werden wir uns genauer ansehen, wie eine Karte aus einer YAML-Datei in Spring Boot eingefügt wird .

Zunächst beginnen wir mit einem kleinen Einblick in YAML-Dateien in Spring Framework. Anschließend zeigen wir anhand eines praktischen Beispiels, wie YAML-Eigenschaften an eine Karte gebunden werden .

2. YAML-Dateien in Spring Framework

Die Verwendung von YAML-Dateien zum Speichern externer Konfigurationsdaten ist unter Spring-Entwicklern üblich. Grundsätzlich unterstützt Spring YAML-Dokumente als Alternative zu Eigenschaften und verwendet SnakeYAML unter der Haube, um sie zu analysieren .

Lassen Sie uns ohne weiteres sehen, wie eine typische YAML-Datei aussieht:

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

Wie wir sehen können, ist die YAML-Datei selbsterklärend und besser lesbar. Tatsächlich bietet YAML eine ausgefallene und übersichtliche Möglichkeit, hierarchische Konfigurationsdaten zu speichern.

Standardmäßig liest Spring Boot beim Start der Anwendung die Konfigurationseigenschaften aus application.properties oder application.yml . Wir können jedoch @PropertySource verwenden , um eine benutzerdefinierte YAML-Datei zu laden.

Nachdem wir nun wissen, was eine YAML-Datei ist, wollen wir sehen, wie YAML-Eigenschaften als Map in Spring Boot eingefügt werden.

3. So injizieren Sie eine Karte aus einer YAML-Datei

Spring Boot hat die Datenexternalisierung mit einer praktischen Anmerkung namens @ConfigurationProperties auf die nächste Ebene gebracht. Diese Anmerkung wird eingeführt , um externe Eigenschaften aus Konfigurationsdateien einfach direkt in Java-Objekte einzufügen .

In diesem Abschnitt wird ausführlich beschrieben, wie YAML-Eigenschaften mithilfe der Annotation @ConfigurationProperties in eine Bean-Klasse eingebunden werden .

Definieren wir zunächst einige Schlüsselwerteigenschaften in 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

In diesem Beispiel versuchen wir, die Anwendung einer einfachen Karte zuzuordnen . In ähnlicher Weise werden wir Konfigurationsdetails als Map einfügen , und Benutzer als Map mit String- Schlüsseln und Objekten, die zu einer benutzerdefinierten Klasse - Credential - gehören, als Werte .

Zweitens erstellen wir eine Bean-Klasse - ServerProperties - , um die Logik der Bindung unserer Konfigurationseigenschaften an Map s zu kapseln :

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

Wie wir sehen können, haben wir die ServerProperties- Klasse mit @ConfigurationProperties dekoriert. Auf diese Weise weisen wir Spring an, alle Eigenschaften mit dem angegebenen Präfix einem Objekt von ServerProperties zuzuordnen .

Denken Sie daran, dass unsere App auch für Konfigurationseigenschaften aktiviert werden muss, obwohl dies in den meisten Spring Boot-Anwendungen automatisch erfolgt.

Lassen Sie uns abschließend testen, ob unsere YAML-Eigenschaften ordnungsgemäß als Map s eingefügt wurden :

@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

Lassen Sie uns nun einen schnellen Vergleich von @ConfigurationProperties und @Value durchführen.

Trotz der Tatsache, dass beide Anmerkungen zum Einfügen von Eigenschaften aus Konfigurationsdateien verwendet werden können , sind sie sehr unterschiedlich. Der Hauptunterschied zwischen diesen beiden Anmerkungen besteht darin, dass jede einen anderen Zweck erfüllt.

Kurz gesagt, mit @V alue können wir einen bestimmten Eigenschaftswert direkt über seinen Schlüssel einfügen . Die Annotation @ConfigurationProperties bindet jedoch mehrere Eigenschaften an ein bestimmtes Objekt und bietet über das zugeordnete Objekt Zugriff auf die Eigenschaften.

Im Allgemeinen empfiehlt Spring, @ConfigurationProperties anstelle von @Value zu verwenden, wenn Konfigurationsdaten eingefügt werden sollen . @ConfigurationProperties bietet eine hervorragende Möglichkeit, Konfigurationseigenschaften in einem strukturierten Objekt zu zentralisieren und zu gruppieren, die wir später in andere Beans einfügen können.

5. Schlussfolgerung

Zusammenfassend haben wir zunächst erklärt, wie eine Map aus einer YAML-Datei in Spring Boot eingefügt wird. Dann haben wir den Unterschied zwischen @ConfigurationProperties und @Value hervorgehoben.

Wie üblich ist der vollständige Quellcode für den Artikel auf GitHub verfügbar.