Инжектирайте карта от YAML файл с Spring

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

В този пример ще се опитаме да преобразуваме приложението в проста карта. По същия начин ще инжектираме подробности за конфигурацията като карта , и потребители като Карта с ключове String и обекти, принадлежащи към дефиниран от потребителя клас - Credential - като стойности .

Второ, нека създадем клас на боб - 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.