Случайно увидел, как кто-то на иностранном форуме жалуется, что способ получения коллегами значений из конфигурационного файла слишком многословен и раздут, поэтому у меня есть эта статья
Адрес демонстрации на гитхабе:springboot-yml-value
1. Что такое yml-файл
application.yml заменяет application.properties, который более удобен для чтения данных конфигурации, особенно когда мы сделали много иерархической конфигурации. yml поддерживает объявление карты, массива, списка, строки, логического значения, числового значения, NULL, даты, что в основном соответствует всем конфигурациям в процессе разработки.
Ниже приведен очень простой файл yml:
server:
url: http://localhost
myapp:
name: MyApplication
threadCount: 4
...
Эквивалентен следующему файлу application.properties:
server.url=http://localhost
server.myapp.name=MyApplication
server.myapp.threadCount=4
...
Файл yml в демо выглядит следующим образом:
server:
url: http://myapp.org
app:
name: MyApplication
threadCount: 10
users:
- Jacob
- James
2.yml для получения конфигурации
Один из способов получить доступ к свойствам yml — использовать@Value("$ {property}")
Комментарии, но с увеличением структуры дерева конфигурации и количества читабельность кода тоже снижается, а это еще более неблагоприятно для бин-менеджмента. Автор нашел еще один элегантный способ обеспечить управление строго типизированными bean-компонентами и более удобный способ проверки конфигурации нашей программы.
Для этого мы создадим@ConfigurationProperties
Класс ServerProperties, который отображает связанный набор свойств:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.ArrayList;
import java.util.List;
/**
* @program: simple-demo
* @description: 映射属性 (server节点)
* @author: CaoTing
* @date: 2019/6/3
**/
@Data
@ConfigurationProperties("server")
public class ServerProperties {
private String url;
private final App app = new App();
public App getApp() {
return app;
}
public static class App {
private String name;
private String threadCount;
private List<String> users = new ArrayList<>();
// TODO getter and setter
}
}
Обратите внимание, что мы можем создать один или несколько классов @ConfigurationProperties.
Определите наш класс конфигурации регистрации Springboot ApplicationConfig:
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @program: simple-demo
* @description: 注册所有映射属性类 { }中用逗号分隔即可注册多个属性类
* @author: CaoTing
* @date: 2019/6/3
**/
@Configuration
@EnableConfigurationProperties({ServerProperties.class})
public class ApplicationConfig {
}
Список классов свойств, которые необходимо зарегистрировать в @EnableConfigurationProperties, уже упоминался здесь.
3. Доступ к свойствам yml
Доступ к свойствам yml теперь можно получить с помощью созданного bean-компонента @ConfigurationProperties. Эти bean-компоненты свойств могут быть внедрены как любой обычный bean-компонент Spring со следующим тестовым классом:
import com.caotinging.ymldemo.application.YmlValueApplication;
import com.caotinging.ymldemo.config.ServerProperties;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @program: simple-demo
* @description: 单元测试类
* @author: CaoTing
* @date: 2019/6/3
**/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = YmlValueApplication.class)
public class AppYmlValueTest {
@Autowired
private ServerProperties config;
@Test
public void printConfigs() {
System.out.println(this.config.getUrl());
System.out.println(this.config.getApp().getName());
System.out.println(this.config.getApp().getThreadCount());
System.out.println(this.config.getApp().getUsers());
}
}
Результаты теста следующие:
4. Дополнение
Потому что некоторые друзья не знают конкретной цели. Позвольте мне добавить плюсы и минусы обоих.
Spring Boot получает свойства из файла конфигурации через аннотацию ConfigurationProperties. Как видно из приведенного выше примера, в аннотации ConfigurationProperties можно указать данные, которые необходимо импортировать пакетами, задав префикс. Поддерживает получение сложных данных, таких как литералы, коллекции, карты, объекты и т. д. Существуют ли другие функции аннотации ConfigurationProperties? В чем разница между ним и аннотацией Spring Value?
a) Преимущества и недостатки ConfigurationProperties и @Value
Преимущества и недостатки аннотации ConfigurationProperties
1. Свойства можно вводить пакетами из конфигурационного файла;
2. Поддержка получения сложных типов данных;
3. Требования к сопоставлению имен атрибутов низкие, например, имя пользователя, имя_пользователя, имя_пользователя и ИМЯ_ПОЛЬЗОВАТЕЛЯ могут принимать значения;
4. Поддержка проверки данных JAVA JSR303;
5. Недостаток в том, что выражения SpEL не поддерживаются;
6. Обеспечить управление строго типизированными бинами и более удобную настройку валидатора;
Преимущества и недостатки аннотации Value прямо противоположны: она может только настраивать вводимые значения по одному, не поддерживает сложные типы данных, такие как массивы и коллекции, не поддерживает проверку данных, предъявляет строгие требования. для сопоставления имени атрибута. Самая большая особенность заключается в том, что он поддерживает выражения SpEL, что делает его более функциональным.
Ответьте на ваши вопросы в разделе комментариев
Что делать, если первое свойство является массивом?
пример yml выглядит следующим образом
orgs:
- math
- chinese
- english
Просто нужен боб, как показано ниже, чтобы получить его легко.
/**
* @program: simple-demo
* @description: 映射Org属性
* @author: CaoTing
* @date: 2019/6/6
**/
@Data
@ConfigurationProperties
public class OrgProperties {
private List<String> orgs;
}
Но не забудьте зарегистрироваться в классе регистрации
@EnableConfigurationProperties({ServerProperties.class, OrgProperties.class})
Репозиторий github также обновил эту часть кода, добро пожаловать на тест, адрес в начале текста.
Существуют также карты и другие более сложные структуры данных, которые можно реализовать, поэтому я не буду тестировать их по отдельности.
Оригинальность непростая, пожалуйста, прикрепите оригинальную ссылку для перепечатки, дайте ему большой палец вверх, если это поможет, заправка ручки.