Springを使用してYAMLファイルからマップを挿入する
1. 概要
In this quick tutorial, we’ll learn how to inject a map from a YAML file in Spring Boot.
まず、SpringFrameworkのYAMLファイルに関する少しの洞察から始めます。 Then we’ll demonstrate how to bind YAML properties to a Map with a practical example.
2. SpringFrameworkのYAMLファイル
YAML ファイルを使用して外部構成データを保存することは、Spring開発者の間で一般的な方法です。 Basically, Spring supports YAML documents as an alternative to properties, and uses SnakeYAML under the hood to parse them.
さらに面倒なことをせずに、典型的なYAMLファイルがどのように見えるかを見てみましょう。
server:
port: 8090
application:
name: myapplication
url: http://myapplication.com
ご覧のとおり、
デフォルトでは、SpringBootはアプリケーションの起動時にapplication.propertiesまたはapplication.ymlから構成プロパティを読み取ります。 ただし、 @PropertySourceを使用して、カスタムYAMLファイルを読み込むことができます。
Now that we’re familiar with what a YAML file is, let’s see how to inject YAML properties as a Map in Spring Boot.
3. How to Inject a Map From a YAML File
Spring Bootは、次のような便利なアノテーションを提供することにより、データの外部化を次のレベルに引き上げました。
In this section, we’ll focus on how to bind YAML properties into a bean class using the @ConfigurationProperties annotation.
First, we’ll define some key-value properties in application.yml:
server:
application:
name: InjectMapFromYAML
url: http://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
この例では、マッピングを試みます応用シンプルに
Then we’ll create a bean class, ServerProperties, to encapsulate the logic of binding our configuration properties to Maps:
@Component
@ConfigurationProperties(prefix = "server")
public class ServerProperties {
private Map<String, String> application;
private Map<String, List<String>> config;
private Map<String, Credential> users;
// getters and setters
public static class Credential {
private String username;
private String password;
// getters and setters
}
}
ご覧のとおり、 ServerProperties とのクラス
これはほとんどのSpringBootアプリケーションで自動的に行われますが、アプリは構成プロパティに対しても有効にする必要があることを思い出してください。
Finally, we’ll test if our YAML properties are properly injected as Maps:
@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と@Value
それでは、@ConfigurationPropertiesと@Value。を簡単に比較してみましょう。
両方のアノテーションを使用して構成ファイル、からプロパティを挿入できるという事実にもかかわらず、それらはまったく異なります。 これら2つの注釈の主な違いは、それぞれが異なる目的を果たすことです。
In short, @Value allows us to directly inject a particular property value by its key. However, @ConfigurationProperties annotation binds multiple properties to a particular object, and provides access to the properties through the mapped object.
一般的に、Springは使用をお勧めします @ConfigurationProperties 以上 @価値構成データの注入に関しては
5. 結論
In this brief article, we discussed how to inject a Map from a YAML file in Spring Boot. Then we highlighted the difference between @ConfigurationProperties and @Value.
As usual, the complete source code for this article is available over on GitHub.