1. Общ преглед
В този бърз урок ще разгледаме отблизо как да инжектираме карта от YAML файл в Spring Boot .
Първо, ще започнем с малко прозрение за YAML файлове в Spring Framework. След това ще покажем чрез практически пример как да обвържем свойствата на YAML с карта .
2. YAML файлове в Spring Framework
Използването на YAML файлове за съхраняване на външни конфигурационни данни е често срещана практика сред разработчиците на Spring. По принцип Spring поддържа YAML документи като алтернатива на свойствата и използва SnakeYAML под капака, за да ги анализира .
Без повече шум, нека видим как изглежда един типичен YAML файл:
server: port: 8090 application: name: myapplication url: //myapplication.com
Както виждаме, файлът YAML е обяснителен и разбираем за хората. В интерес на истината YAML предоставя изискан и кратък начин за съхраняване на йерархични конфигурационни данни.
По подразбиране Spring Boot чете свойствата на конфигурацията от application.properties или application.yml при стартиране на приложението. Въпреки това можем да използваме @PropertySource, за да заредим персонализиран YAML файл.
След като вече сме запознати с това какво представлява YAML файл, нека видим как да инжектираме YAML свойства като Map в Spring Boot.
3. Как да инжектирам карта от YAML файл
Spring Boot изведе екстернацията на данни на следващото ниво, като предостави удобна анотация, наречена @ConfigurationProperties. Тази анотация е въведена за лесно инжектиране на външни свойства от конфигурационни файлове директно в Java обекти .
В този раздел ще разгледаме задълбочено как да свържем свойствата на YAML в клас на боб с помощта на анотацията @ConfigurationProperties .
Първо, нека дефинираме някои свойства ключ-стойност в application.yml :
server: application: name: InjectMapFromYAML url: //injectmapfromyaml.dev description: How To Inject a map from a YAML File in Spring Boot config: ips: - 10.10.10.10 - 10.10.10.11 - 10.10.10.12 - 10.10.10.13 filesystem: - /dev/root - /dev/md2 - /dev/md4 users: root: username: root password: rootpass guest: username: guest password: guestpass
В този пример ще се опитаме да преобразуваме приложението в проста карта. По същия начин ще инжектираме подробности за конфигурацията като карта
Второ, нека създадем клас на боб - ServerProperties - за капсулиране на логиката на обвързване на нашите конфигурационни свойства с Map s:
@Component @ConfigurationProperties(prefix = "server") public class ServerProperties { private Map application; private Map
config; private Map users; // getters and setters public static class Credential { private String username; private String password; // getters and setters } }
Както виждаме, украсихме класа ServerProperties с @ConfigurationProperties. По този начин казваме на Spring да картографира всички свойства с посочения префикс към обект на ServerProperties .
Спомнете си, че нашето приложение трябва да бъде активирано и за свойствата на конфигурацията, въпреки че това се прави автоматично в повечето приложения на Spring Boot.
И накрая, нека тестваме дали нашите YAML свойства са правилно инжектирани като Map s:
@RunWith(SpringRunner.class) @SpringBootTest class MapFromYamlIntegrationTest { @Autowired private ServerProperties serverProperties; @Test public void whenYamlFileProvidedThenInjectSimpleMap() { assertThat(serverProperties.getApplication()) .containsOnlyKeys("name", "url", "description"); assertThat(serverProperties.getApplication() .get("name")).isEqualTo("InjectMapFromYAML"); } @Test public void whenYamlFileProvidedThenInjectComplexMap() { assertThat(serverProperties.getConfig()).hasSize(2); assertThat(serverProperties.getConfig() .get("ips") .get(0)).isEqualTo("10.10.10.10"); assertThat(serverProperties.getUsers() .get("root") .getUsername()).isEqualTo("root"); } }
4. @ConfigurationProperties срещу @Value
Сега нека направим бързо сравнение на @ConfigurationProperties и @Value.
Въпреки факта, че и двете анотации могат да се използват за инжектиране на свойства от конфигурационни файлове , те са доста различни. Основната разлика между тези две анотации е, че всяка служи за различна цел.
С една дума, @V alue ни позволява да се инжектира директно конкретен имот стойност от основния си. Обяснението @ConfigurationProperties обаче свързва множество свойства към определен обект и осигурява достъп до свойствата чрез картографирания обект.
По принцип Spring препоръчва да се използва @ConfigurationProperties над @Value, когато става въпрос за инжектиране на конфигурационни данни . @ConfigurationProperties предлага чудесен начин за централизиране и групиране на свойствата на конфигурацията в структуриран обект, който можем да инжектираме по-късно в други компоненти.
5. Заключение
За да обобщим, първо обяснихме как да инжектираме карта от YAML файл в Spring Boot. След това подчертахме разликата между @ConfigurationProperties и @Value.
Както обикновено, пълният изходен код на статията е достъпен в GitHub.