Бой Spring Boot 2: распространенные способы чтения конфигурации

Spring Boot Java

1. Введение

существуетSpring BootВ проекте нам часто нужно читатьapplication.ymlПользовательская конфигурация файла конфигурации, сегодня мы перечислимyamlНекоторые распространенные средства и методы чтения конфигурационных файлов.

2. Используйте аннотацию @Value

Во-первых, подумайте об использовании@ValueАннотация, аннотация может быть проанализирована толькоyamlПростые типы в файлах и привязанные к свойствам объекта.

felord:
  phone: 182******32
  def:
    name: 码农小胖哥
    blog: felord.cn
    we-chat: MSW_623
  dev:
    name: 码农小胖哥
    blog: felord.cn
    we-chat: MSW_623
  type: JUEJIN  

для вышеперечисленногоyamlконфигурации, если мы используем@ValueВ случае аннотаций сразу после двоеточия стоит значениеkeyЧтобы правильно ввести соответствующее значение. Напримерfelord.phoneмы можем пройти@Valueполучить, ноfelord.defнет потому чтоfelord.defЗа ним нет прямого значения, у него также есть опции следующего уровня. Кроме того@Valueне поддерживаетсяyamlслабо связанный синтаксис, т.felord.def.weChatне могу понятьfelord.def.we-chatзначение .

@Valueс помощьюSpringизSpELвыражение для получения соответствующего значения:

// 获取 yaml 中 felord.phone的值 并提供默认值 UNKNOWN
@Value("${felord.phone:UNKNOWN}")
 private String phone;

@ValueСценарий использования заключается в том, что когда нам нужно только получить определенное значение в файле конфигурации, если нам нужно связать и внедрить ряд значений, рекомендуется использовать сложный объект для инъекции.

3. Аннотируйте с помощью @ConfigurationProperties

@ConfigurationPropertiesАннотации дают нам возможность внедрять несколько параметров конфигурации в сложные объекты. Это требует от нас указать общий префикс для конфигурации. Например, мы хотим связатьfelord.defВсе элементы конфигурации в разделе:

package cn.felord.yaml.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import static cn.felord.yaml.properties.FelordDefProperties.PREFIX;

/**
 * @author felord.cn
 */
@Data
@ConfigurationProperties(PREFIX)
public class FelordDefProperties {
    static final String PREFIX = "felord.def";
    private String name;
    private String blog;
    private String weChat;
}

Мы замечаем, что можем использоватьweChatперениматьwe-chatзначение, так как эта форма поддерживает верблюжий регистр отcamel-caseк именам, разделенным тиреkebab-caseавтоматическое преобразование.

если мы используем@ConfigurationPropertiesЕсли это так, рекомендуется настроить имя класса с суффиксомProperties,НапримерRedisСуффиксRedisProperties,RabbitMQзаRabbitProperties.

Кроме того, если мы хотим вложиться, мы можем воспользоваться помощью@NestedConfigurationPropertyРеализация аннотации. Вы также можете использовать внутренние классы. Здесь начнется реализация внутреннего классаyamlВнедрить все свойства в:

package cn.felord.yaml.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import static cn.felord.yaml.properties.FelordProperties.PREFIX;


/**
 * 内部类和枚举配置.
 *
 * @author felord.cn
 */
@Data
@ConfigurationProperties(PREFIX)
public class FelordProperties {

    static final String PREFIX = "felord";
    private Def def;
    private Dev dev;
    private Type type;

    @Data
    public static class Def {
        private String name;
        private String blog;
        private String weChat;
    }

    @Data
    public static class Dev {
        private String name;
        private String blog;
        private String weChat;
    }

    public enum Type {
        JUEJIN,
        SF,
        OSC,
        CSDN
    }
}

Использовать отдельно@ConfigurationPropertiesЕсли вы по-прежнему не можете напрямую использовать объект конфигурацииFelordDefProperties, потому что он не зарегистрирован какSpring Bean. Мы можем заставить его работать двумя способами.

3.1 Явное внедрение Spring IoC

ты можешь использовать@Component,@Configurationи т.д. Аннотации будутFelordDefPropertiesинъекцияSpring IoCсделать его эффективным.

package cn.felord.yaml.properties;

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

import static cn.felord.yaml.properties.FelordDefProperties.PREFIX;

/**
 * 显式注入Spring IoC 
 * @author felord.cn
 */
@Data
@Component
@ConfigurationProperties(PREFIX)
public class FelordDefProperties {
    static final String PREFIX = "felord.def";
    private String name;
    private String blog;
    private String weChat;
}

3.2 Регистрация с помощью @EnableConfigurationProperties

Мы также можем использовать аннотации@EnableConfigurationPropertiesЗарегистрируйтесь, чтобы вам не нужно было явно объявлять класс конфигурации какSpring Bean.

package cn.felord.yaml.configuration;

import cn.felord.yaml.properties.FelordDevProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * 使用 {@link EnableConfigurationProperties} 注册 {@link FelordDevProperties}使之生效
 * @author felord.cn
 */
@EnableConfigurationProperties({FelordDevProperties.class})
@Configuration
public class FelordConfiguration {
}

Эта аннотация требует явной регистрации соответствующего класса конфигурации.

3.3 Сканирование с помощью @ConfigurationPropertiesScan

существуетSpring Boot 2.2.0.RELEASEАннотация к скану представлена ​​в@ConfigurationPropertiesScan. Он может сканировать все@ConfigurationPropertiesотмеченные классы конфигурации и сделать ихIoCинъекция.

package cn.felord.yaml;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

/**
 * {@link ConfigurationPropertiesScan} 同 {@link EnableConfigurationProperties} 二选一
 *
 * @see cn.felord.yaml.configuration.FelordConfiguration
 * @author felord.cn
 */
@ConfigurationPropertiesScan
@SpringBootApplication
public class SpringBootYamlApplication {

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

}

Это очень удобно для автоматического внедрения и пакетного внедрения классов конфигурации, но существуют ограничения версии, которые должны быть в2.2.0и выше.

3.4 Environment

Spring Bootпроекты также могут бытьorg.springframework.core.env.Environmentкоторый предоставилgetProperty(String key)для получения, как правило, не очень часто используется.

4. Резюме

Рекомендуется использовать один атрибут в ежедневной разработке@Value, рекомендуется, если в одной группе несколько свойств@ConfigurationProperties. Необходимо добавить, что@ConfigurationPropertiesТакже поддерживается проверка атрибутов с использованием JSR303. Уделять больше внимания:Код Фермер Маленький Толстый БратПолучите больше технических галантерейных товаров. СвязанныйdemoОтвет через официальный аккаунтyamlПолучать.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn