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

ご覧のとおり、 YAMLファイルは自明であり、より人間が読める形式です。 実際のところ、YAMLは、階層構成データを格納するための派手で簡潔な方法を提供します。

デフォルトでは、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は、次のような便利なアノテーションを提供することにより、データの外部化を次のレベルに引き上げました。 @ConfigurationProperties。 この注釈が導入されました構成ファイルからJavaオブジェクトに直接外部プロパティを簡単に挿入します

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

この例では、マッピングを試みます応用シンプルに地図Similarly, we’ll inject config details as a Map>, users as a Map with String keys, and objects belonging to a user-defined class (Credential) as values.

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 とのクラス @ConfigurationProperties。 このようにして、指定されたプレフィックスを持つすべてのプロパティを次のオブジェクトにマップするようにSpringに指示します。 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 以上 @価値構成データの注入に関しては 。 @ConfigurationProperties 後で他のBeanに注入できる構造化オブジェクトの構成プロパティを一元化およびグループ化するための優れた方法を提供します。

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.