Injiser arrays og lister fra Spring Properties Files

1. Oversikt

I denne raske opplæringen skal vi lære å injisere verdier i en matrise eller Liste fra en våregenskapsfil.

2. Standard atferd

Vi skal begynne med et enkelt application.properties fil:

arrayOfStrings = Baeldung, dot, com

La oss se hvordan våren oppfører seg når vi setter vår variabeltype til Streng []:

@Value ("$ {arrayOfStrings}") privat streng [] arrayOfStrings;
@Test ugyldig nårContextIsInitialized_thenInjectedArrayContainsExpectedValues ​​() {assertEquals (new String [] {"Baeldung", "dot", "com"}, arrayOfStrings); }

Vi kan se at Spring antar at skilletegnet vårt er et komma og initialiserer matrisen deretter.

Vi bør også merke oss at som standard fungerer injeksjon av en matrise bare riktig når vi har kommaadskilte verdier.

3. Injiseringslister

Hvis vi prøver å injisere en Liste på samme måte får vi et overraskende resultat:

@Value ("$ {arrayOfStrings}") privat liste uventet ListOfStrings;
@Test ugyldig nårContextIsInitialized_thenInjectedListContainsUnexpectedValues ​​() {assertEquals (Collections.singletonList ("Baeldung, dot, com"), uventetListOfStrings); }

Våre Liste inneholder et enkelt element, som er lik verdien vi setter i vår eiendomsfil.

For å injisere en Liste, må vi bruke en spesiell syntaks kalt Spring Expression Language (SpEL):

@Value ("# {'$ {arrayOfStrings}'. Split (',')}") privat liste listeOfStrings;
@Test ugyldig nårContextIsInitialized_thenInjectedListContainsExpectedValues ​​() {assertEquals (Arrays.asList ("Baeldung", "dot", "com"), listOfStrings); }

Vi kan se at uttrykket vårt begynner med # i stedet for $ som vi er vant med @Verdi.

Vi bør også merke oss at vi påkaller a dele metode, som gjør uttrykket litt mer komplekst enn en vanlig injeksjon.

Hvis vi ønsker å holde uttrykket litt enklere, kan vi erklære eiendommen vår i et spesielt format:

listOfStrings = {'Baeldung', 'dot', 'com'}

Våren vil gjenkjenne dette formatet, og vi kan injisere vårt Liste bruker et noe enklere uttrykk:

@Value ("# {$ {listOfStrings}}") privat liste listOfStringsV2;
@Test ugyldig nårContextIsInitialized_thenInjectedListV2ContainsExpectedValues ​​() {assertEquals (Arrays.asList ("Baeldung", "dot", "com"), listOfStringsV2); }

4. Bruke egendefinerte avgrensere

La oss lage en lignende egenskap, men denne gangen skal vi bruke en annen avgrenser:

listOfStringsWithCustomDelimiter = Baeldung; punkt; com

Som vi har sett når vi injiserer Lister, kan vi bruke et spesielt uttrykk der vi kan spesifisere ønsket skilletegn:

@Value ("# {'$ {listOfStringsWithCustomDelimiter}'. Split (';')}") privat liste listeOfStringsWithCustomDelimiter;
@Test ugyldig nårContextIsInitialized_thenInjectedListWithCustomDelimiterContainsExpectedValues ​​() {assertEquals (Arrays.asList ("Baeldung", "dot", "com"), listOfStringsWithCustomDelimiter); }

5. Injisering av andre typer

La oss ta en titt på følgende egenskaper:

listOfBooleans = false, false, true listOfIntegers = 1,2,3,4 listOfCharacters = a, b, c

Vi kan se at våren støtter grunnleggende typer out-of-the-box, så vi trenger ikke å gjøre noen spesiell parsing:

@Value ("# {'$ {listOfBooleans}'. Split (',')}") privat liste listOfBooleans; @Value ("# {'$ {listOfIntegers}'. Split (',')}") private List listOfIntegers; @Value ("# {'$ {listOfCharacters}'. Split (',')}") privat liste listOfCharacters;
@Test ugyldig nårContextIsInitialized_thenInjectedListOfBasicTypesContainsExpectedValues ​​() {assertEquals (Arrays.asList (false, false, true), listOfBooleans); assertEquals (Arrays.asList (1, 2, 3, 4), listOfIntegers); assertEquals (Arrays.asList ('a', 'b', 'c'), listOfCharacters); }

Dette støttes bare via SpEL, så vi kan ikke injisere en matrise på samme måte.

6. Leseegenskaper programmatisk

For å kunne lese egenskaper programmatisk, må vi først få forekomsten av vår Miljø gjenstand:

@Autowired private Environment miljø;

Da kan vi ganske enkelt bruke getProperty metode for å lese en hvilken som helst eiendom ved å spesifisere nøkkelen og forventet type:

@Test ugyldig nårReadingFromSpringEnvironment_thenPropertiesHaveExpectedValues ​​() {String [] arrayOfStrings = environment.getProperty ("arrayOfStrings", String []. Class); List listOfStrings = (List) environment.getProperty ("arrayOfStrings", List.class); assertEquals (ny streng [] {"Baeldung", "dot", "com"}, arrayOfStrings); assertEquals (Arrays.asList ("Baeldung", "dot", "com"), listOfStrings); }

7. Konklusjon

I denne raske opplæringen har vi lært hvordan vi enkelt kan injisere matriser og Listes gjennom raske og praktiske eksempler.

Som alltid er koden tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found