Пример Spring Boot YAML

Короче говоря, создайте application.yml в папке src/resources, Spring Boot автоматически загрузит и разберет .yml файл и привяжет значения к классам, которые аннотированы @ConfigurationProperties. Аннотация @ConfigurationProperties позволяет автоматически и мощно обращаться к свойствам, заданным в конфигурационных файлах (application.properties или application.yml).

YAML и свойства

  • application.yml
logging:
  level:
    org.springframework: ERROR
    com.example: DEBUG

spring:
  profiles:
    active: dev
  main:
    banner-mode: off

email: haunt.hcm2015@gmail.com
thread-pool: 10

wordpress:
  menus:
    - title: Home
      name: Home
      path: /
    - title: About
      name: About
      path: /about
  themes:
    default-folder: /wp-content/themes/toptech
  servers:
    - ip: 127.0.0.1
      path: /dev1
    - ip: 127.0.0.2
      path: /dev2
    - ip: 127.0.0.3
      path: /dev3
Вход в полноэкранный режим Выйти из полноэкранного режима
  • application.properties
# Spring Boot
logging.level.org.springframework=ERROR
logging.level.com.mkyong=DEBUG
spring.profiles.active=dev
spring.main.banner-mode=off

# Global
email=haunt.hcm2015@gmail.com
thread-pool=10

# WordPress
wordpress.menus[0].title=Home
wordpress.menus[0].name=Home
wordpress.menus[0].path=/
wordpress.menus[1].title=About
wordpress.menus[1].name=About
wordpress.menus[1].path=/about
wordpress.themes.default-folder=/wp-content/themes/toptech
wordpress.servers[0].ip=127.0.0.1
wordpress.servers[0].path=/dev1
wordpress.servers[1].ip=127.0.0.2
wordpress.servers[1].path=/dev2
wordpress.servers[2].ip=127.0.0.3
wordpress.servers[2].path=/dev3
Войти в полноэкранный режим Выйти из полноэкранного режима

Структура проекта

Зависимость проекта

Spring Boot использует библиотеку SnakeYAML для разбора YAML файла, а библиотека SnakeYAML предоставляется spring-boot-starter.

Библиотека и зависимости настраиваются в файле pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-yaml-example</artifactId>
    <packaging>jar</packaging>
    <name>Spring Boot YAML Example</name>
    <url>https://www.mkyong.com</url>
    <version>1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>

        </plugins>
    </build>
</project>
Вход в полноэкранный режим Выход из полноэкранного режима

Spring Boot + YAML

Spring Boot загрузит и разберет файл YAML и свяжет значения в следующих классах @ConfigurationProperties.

  • Menu.java
package com.example.yaml.config.model;

public class Menu {
    private String name;
    private String path;
    private String title;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Menu{" +
                "name='" + name + ''' +
                ", path='" + path + ''' +
                ", title='" + title + ''' +
                '}';
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Server.java
package com.example.yaml.config.model;

public class Server {
    private String ip;
    private String path;
    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    @Override
    public String toString() {
        return "Server{" +
                "ip='" + ip + ''' +
                ", path='" + path + ''' +
                '}';
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Theme.java
package com.example.yaml.config.model;

public class Theme {
    private String defaultFolder;
    public String getDefaultFolder() {
        return defaultFolder;
    }

    public void setDefaultFolder(String defaultFolder) {
        this.defaultFolder = defaultFolder;
    }

    @Override
    public String toString() {
        return "Theme{" +
                "defaultFolder='" + defaultFolder + ''' +
                '}';
    }
}
Войти в полноэкранный режим Выход из полноэкранного режима
  • GlobalProperties.java
package com.example.yaml.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties
public class GlobalProperties {
    private int threadPool;
    private String email;
    public int getThreadPool() {
        return threadPool;
    }

    public void setThreadPool(int threadPool) {
        this.threadPool = threadPool;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "GlobalProperties{" +
                "threadPool=" + threadPool +
                ", email='" + email + ''' +
                '}';
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Имена сеттеров (и геттеров) должны соответствовать именам свойств в файле application.properties (или application.yml)

  • WordPressProperties.java
package com.example.yaml.config;

import com.example.yaml.config.model.Menu;
import com.example.yaml.config.model.Server;
import com.example.yaml.config.model.Theme;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@ConfigurationProperties("wordpress")
public class WordPressProperties {

    private List<Menu> menus = new ArrayList<>();
    private Theme themes;
    private List<Server> servers = new ArrayList<>();
    public List<Menu> getMenus() {
        return menus;
    }

    public void setMenus(List<Menu> menus) {
        this.menus = menus;
    }

    public Theme getThemes() {
        return themes;
    }

    public void setThemes(Theme themes) {
        this.themes = themes;
    }

    public List<Server> getServers() {
        return servers;
    }

    public void setServers(List<Server> servers) {
        this.servers = servers;
    }

    @Override
    public String toString() {
        return "WordpressProperties{" +
                "menus=" + menus +
                ", themes=" + themes +
                ", servers=" + servers +
                '}';
    }
}

Вход в полноэкранный режим Выйти из полноэкранного режима

Spring будет автоматически искать свойства, размещенные внутри application.properties или application.yml с префиксом wordpress и внедрять их в соответствующие свойства класса WordPressProperties.

Запустите Spring Boot в обычном режиме и выведите значения.

DEMO


Исходный код

https://github.com/java-cake/spring-boot/tree/main/yaml

Оцените статью
devanswers.ru
Добавить комментарий