1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/GiteeOS-springboot-guide

Клонировать/Скачать
read-config-properties.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.06.2025 10:20 f496caa

Часто нам необходимо помещать часто используемые конфигурационные данные, такие как конфигурация OSS Alibaba Cloud, данные для отправки SMS и т.д., в конфигурационные файлы.

Давайте рассмотрим, какие способы предоставляет Spring для чтения этих конфигурационных данных из конфигурационных файлов.

Содержимое файла application.yml:

wuhan2020: В начале 2020 года в Ухане произошел всплеск новой коронавирусной инфекции, ситуация была серьезной, но я верю, что все это пройдет! Ухань, держись! Китай, держись!

my-profile:
  name: Guide哥
  email: koushuangbwcx@163.com

library:
  location: Ухань, держись! Китай, держись!
  books:
    - name: Базовые законы гения
      description: В 22 года Лин Чжаокси узнала, что её отец был диагностирован с болезнью Альцгеймера, в тот же день она узнала, что её любимый наставник Пэй Чжи собирается уехать за границу для обучения — в ту самую школу, которую её отец отказался посещать ради неё.
    - name: Порядок времени
      description: Почему мы помним прошлое, а не будущее? Что означает "проходит" время? Мы существуем внутри времени, или время существует внутри нас? Карло Ровелли использует поэтический язык, чтобы пригласить нас задуматься над этой вечной проблемой — сущность времени.
    - name: Великолепный я
      description: Как выработать новый привычный образ мышления? Как сделать свой ум более зрелым? Как иметь высококачественные отношения? Как выйти из трудного периода жизни?

В этом тексте переведены китайские фразы и оставлены без изменений технические элементы и структура файла application.yml.### 1. Чтение простых конфигурационных данных с помощью @value

Используем @Value("${property}") для чтения простых конфигурационных данных:

@Value("${wuhan2020}")
String wuhan2020;

Важно отметить, что использование @value не рекомендуется. Spring рекомендует использовать следующие способы чтения конфигурационных данных.

2. Чтение конфигурационных данных с помощью @ConfigurationProperties и связывание с bean

Класс LibraryProperties помечен аннотацией @Component, что позволяет использовать его как обычный bean.


import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@ConfigurationProperties(prefix = "library")
@Setter
@Getter
@ToString
class LibraryProperties {
    private String location;
    private List<Book> books;
}
    @@Setter
    @@Getter
    @ToString
    static class Book {
        String name;
        String description;
    }
}

Когда вы закончите, вы сможете использовать этот бин так же, как обычный бин, внедряя его в класс:

package cn.javaguide.readconfigproperties;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author shuang.kou
 */
@SpringBootApplication
public class ReadConfigPropertiesApplication implements InitializingBean {

    private final LibraryProperties library;

    public ReadConfigPropertiesApplication(LibraryProperties library) {
        this.library = library;
    }

    public static void main(String[] args) {
        SpringApplication.run(ReadConfigPropertiesApplication.class, args);
    }
}
```    @Override
    public void afterPropertiesSet() {
        System.out.println(library.getLocation());
        System.out.println(library.getBooks());
    }
}

Вывод в консоль:

Хубэй, Ухань, дай фу, Китай, дай фу
[LibraryProperties.Book(name=Талант базовые законы, description........]

3. Чтение и валидация с помощью @ConfigurationProperties

Сначала измените application.yml на следующий формат, который явно не является правильным форматом email:

my-profile:
  name: Гайд哥
  email: koushuangbwcx@

Класс ProfileProperties не аннотирован как @Component. Мы регистрируем наш конфигурационный бин с помощью @EnableConfigurationProperties там, где нам нужно использовать ProfileProperties:

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;

/**
 * @author shuang.kou
 */
@Getter
@Setter
@ToString
@ConfigurationProperties("my-profile")
@Validated
public class ProfileProperties {
    @NotEmpty
    private String name;

    @Email
    @NotEmpty
    private String email;

    // Если значение не было прочитано из конфигурационного файла, используется значение по умолчанию
    private Boolean handsome = Boolean.TRUE;
}

Конкретное использование:

package cn.javaguide.readconfigproperties;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

/**
 * @author shuang.kou
 */
@SpringBootApplication
@EnableConfigurationProperties(ProfileProperties.class)
public class ReadConfigPropertiesApplication implements InitializingBean {
    private final ProfileProperties profileProperties;
}
```    public ReadConfigPropertiesApplication(ProfileProperties profileProperties) {
        this.profileProperties = profileProperties;
    }

    public static void main(String[] args) {
        SpringApplication.run(ReadConfigPropertiesApplication.class, args);
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println(profileProperties.toString());
    }
}

Поскольку формат нашего электронного адреса неверен, при запуске программы возникает ошибка, и программа не запускается. Это гарантирует безопасность типов данных:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'my-profile' to cn.javaguide.readconfigproperties.ProfileProperties failed:

    Property: my-profile.email
    Value: koushuangbwcx@
    Origin: class path resource [application.yml]:5:10
    Reason: must be a well-formed email address

После того как мы изменили тестовый электронный адрес на правильный, при запуске программа успешно выводит прочитанные данные:

ProfileProperties(name=Guide哥, email=koushuangbwcx@163.com, handsome=true)

4. Чтение определенного файла properties с помощью @PropertySource

import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:website.properties")
@Getter
@Setter
class WebSite {
    @Value("${url}")
    private String url;
}

Использование:

@Autowired
private WebSite webSite;

System.out.println(webSite.getUrl());//https://javaguide.cn/

5. Отступление: Приоритет загрузки конфигурационных файлов в Spring

Spring также имеет приоритет загрузки конфигурационных файлов, вот схема:

Для более подробной информации обратитесь к официальной документации: https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

Исходный код данной статьи: https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/чтение-конфигурационных-свойств

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/GiteeOS-springboot-guide.git
git@api.gitlife.ru:oschina-mirror/GiteeOS-springboot-guide.git
oschina-mirror
GiteeOS-springboot-guide
GiteeOS-springboot-guide
master