En rask guide til våren @Value

1. Oversikt

I denne raske opplæringen skal vi ta en titt på @Verdi Vårkommentar.

Denne merknaden kan brukes til å injisere verdier i felt i vårstyrte bønner, og den kan brukes på felt- eller konstruktør- / metodeparameternivå.

2. Sette opp applikasjonen

For å beskrive forskjellige typer bruk for denne kommentaren, må vi konfigurere en enkel Spring-applikasjonskonfigurasjonsklasse.

Naturlig, vi trenger en eiendomsfil for å definere verdiene vi ønsker å injisere med @Verdi kommentar. Og så må vi først definere en @PropertySource i vår konfigurasjonsklasse - med egenskapsfilnavnet.

La oss definere egenskapsfilen:

value.from.file = Verdien er hentet fra filprioriteten = high listOfValues ​​= A, B, C

3. Brukseksempler

Som et grunnleggende og stort sett ubrukelig eksempel kan vi bare injisere "strengverdi" fra kommentaren til feltet:

@Value ("string value") private String stringValue;

Bruker @PropertySource merknader lar oss jobbe med verdier fra egenskapsfiler med @Verdi kommentar.

I det følgende eksemplet får vi Verdien ble hentet fra filen tildelt feltet:

@Value ("$ {value.from.file}") privat streng valueFromFile;

Vi kan også sette verdien fra systemegenskaper med samme syntaks.

La oss anta at vi har definert en systemegenskap som heter systemValue:

@Value ("$ {systemValue}") privat streng systemValue;

Standardverdier kan oppgis for egenskaper som kanskje ikke er definert. Her, verdien noen standard vil bli injisert:

@Value ("$ {unknown.param: some default}") private String someDefault;

Hvis den samme egenskapen er definert som en systemegenskap og i egenskapsfilen, vil systemegenskapen bli brukt.

Anta at vi hadde en eiendom prioritet definert som en systemegenskap med verdien Systemegenskap og definert som noe annet i egenskapsfilen. Verdien ville være Systemegenskap:

@Value ("$ {prioritet}") privat streng prioritetSystemProperty;

Noen ganger trenger vi å injisere en rekke verdier. Det ville være praktisk å definere dem som kommaadskilte verdier for den eneste egenskapen i egenskapsfilen eller som en systemegenskap og å injisere i en matrise.

I den første delen definerte vi kommadelte verdier i listOfValues av eiendomsfilen, slik at verdiene for matrisen ville være [“A”, “B”, “C”]:

@Value ("$ {listOfValues}") privat streng [] valuesArray;

4. Avanserte eksempler med SpEL

Vi kan også bruke SpEL-uttrykk for å få verdien.

Hvis vi har en systemegenskap som heter prioritet, deretter blir verdien brukt på feltet:

@Value ("# {systemProperties ['prioritet']}") privat streng spelValue;

Hvis vi ikke har definert systemegenskapen, så null verdien tildeles.

For å forhindre dette kan vi oppgi en standardverdi i SpEL-uttrykket. Vi får noen standard verdi for feltet hvis systemegenskapen ikke er definert:

@Value ("# {systemProperties ['unknown']?: 'Some default'}") private String spelSomeDefault;

Videre kan vi bruke en feltverdi fra andre bønner. Anta at vi har en bønne som heter someBean med et felt someValue lik 10. Deretter, 10 vil bli tildelt feltet:

@Value ("# {someBean.someValue}") privat Heltall someBeanValue;

Vi kan manipulere egenskaper for å få en Liste av verdier, her, en liste over strengverdier A, B og C:

@Value ("# {'$ {listOfValues}'. Split (',')}") private List valuesList;

5. Bruke @Verdi Med Kart

Vi kan også bruke @Verdi kommentar for å injisere en Kart eiendom.

Først må vi definere egenskapen i {nøkkel: ‘verdi’} form i vår eiendomsfil:

valuesMap = {key1: '1', key2: '2', key3: '3'}

Vær oppmerksom på at verdiene i Kart må være i enkelt anførselstegn.

Nå kan vi injisere denne verdien fra eiendomsfilen som en Kart:

@Value ("# {$ {valuesMap}}") privat Map valuesMap;

Hvis vi trenger det for å få verdien av en bestemt nøkkel i Kart, alt vi trenger å gjøre er legg til nøkkelens navn i uttrykket:

@Value ("# {$ {valuesMap} .key1}") private Integer valuesMapKey1;

Hvis vi ikke er sikre på om Kart inneholder en viss nøkkel, bør vi velge et tryggere uttrykk som ikke vil kaste et unntak, men sette verdien til null når nøkkelen ikke er funnet:

@Value ("# {$ {valuesMap} ['unknownKey']}") privat Heltall unknownMapKey;

Vi kan også angi standardverdier for egenskapene eller nøklene som kanskje ikke eksisterer:

@Value ("# {$ {unknownMap: {key1: '1', key2: '2'}}") private Map unknownMap; @Value ("# {$ {valuesMap} ['unknownKey']?: 5}") privat Heltall unknownMapKeyWithDefaultValue;

Kart oppføringer kan også filtreres før injeksjon.

La oss anta at vi trenger å få bare de oppføringene hvis verdier er større enn en:

@Value ("# {$ {valuesMap}.? [Value> '1']}") private KartverdierMapFiltered;

Vi kan også bruke @Verdi kommentar til injiser alle gjeldende systemegenskaper:

@Value ("# {systemProperties}") privat Kart systemPropertiesMap;

6. Bruke @Verdi Med Constructor Injection

Når vi bruker @Verdi kommentar, vi er ikke begrenset til feltinjeksjon. Vi kan også bruke den sammen med konstruktørinjeksjon.

La oss se dette i praksis:

@Component @PropertySource ("classpath: values.properties") offentlig klasse PriorityProvider {privat strengprioritet; @Autowired offentlig PriorityProvider (@Value ("$ {prioritet: normal}") Stringprioritet) {this.priority = prioritet; } // standard getter}

I eksemplet ovenfor injiserer vi a prioritet direkte inn i vår PriorityProvider’S konstruktør.

Merk at vi også oppgir en standardverdi i tilfelle eiendommen ikke blir funnet.

7. Bruke @Verdi Med Setter Injection

Analogt med konstruktørinjeksjonen, vi kan også bruke @Verdi med setterinjeksjon.

La oss ta en titt:

@Component @PropertySource ("classpath: values.properties") offentlig klasse CollectionProvider {private List values ​​= new ArrayList (); @Autowired public void setValues ​​(@Value ("# {'$ {listOfValues}'. Split (',')}") Listeverdier) {this.values.addAll (verdier); } // standard getter}

Vi bruker uttrykket SpEL for å injisere en liste over verdier i setValues metode.

8. Konklusjon

I denne artikkelen undersøkte vi de ulike mulighetene for å bruke @Verdi kommentar med enkle egenskaper definert i filen, med systemegenskaper og med egenskaper beregnet med SpEL-uttrykk.

Som alltid er eksempelprogrammet tilgjengelig på GitHub-prosjektet.