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;
}
Мы замечаем, что можем использовать
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