En hurtig guide til Spring @Value

1. Oversigt

I denne hurtige vejledning skal vi se på @Værdi Forårsnotering.

Denne kommentar kan bruges til at injicere værdier i felter i Spring-managed beans, og den kan anvendes på felt- eller konstruktør- / metodeparameterniveau.

2. Opsætning af applikationen

For at beskrive forskellige former for brug til denne kommentar skal vi konfigurere en simpel Spring-applikationskonfigurationsklasse.

Naturligt, vi har brug for en egenskabsfil for at definere de værdier, vi vil injicere med @Værdi kommentar. Og så skal vi først definere en @PropertySource i vores konfigurationsklasse - med egenskabsfilnavnet.

Lad os definere egenskabsfilen:

value.from.file = Værdi hentet fra filens prioritet = high listOfValues ​​= A, B, C

3. Brugseksempler

Som et grundlæggende og mest ubrugeligt eksempel kan vi kun injicere "strengværdi" fra kommentaren til feltet:

@Value ("strengværdi") privat String stringValue;

Bruger @PropertySource annotation giver os mulighed for at arbejde med værdier fra egenskabsfiler med @Værdi kommentar.

I det følgende eksempel får vi Værdien blev hentet fra filen tildelt feltet:

@Value ("$ {value.from.file}") privat streng værdiFromFile;

Vi kan også indstille værdien fra systemegenskaber med samme syntaks.

Lad os antage, at vi har defineret en navngivet systemegenskab systemValue:

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

Standardværdier kan angives for egenskaber, der muligvis ikke defineres. Her er værdien nogle standarder vil blive injiceret:

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

Hvis den samme egenskab er defineret som en systemegenskab og i egenskabsfilen, anvendes systemegenskaben.

Antag, at vi havde en ejendom prioritet defineret som en systemegenskab med værdien Systemegenskab og defineret som noget andet i egenskabsfilen. Værdien ville være Systemegenskab:

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

Nogle gange er vi nødt til at indsprøjte en masse værdier. Det ville være praktisk at definere dem som komma-adskilte værdier for den enkelte egenskab i egenskabsfilen eller som en systemegenskab og indsprøjte dem i en matrix.

I det første afsnit definerede vi kommaseparerede værdier i listOfValues af egenskabsfilen, så matrixværdierne ville være [“A”, “B”, “C”]:

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

4. Avancerede eksempler med SpEL

Vi kan også bruge SpEL-udtryk for at få værdien.

Hvis vi har en systemegenskab navngivet prioritet, så vil dens værdi blive anvendt på feltet:

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

Hvis vi ikke har defineret systemegenskaben, så nul værdi tildeles.

For at forhindre dette kan vi angive en standardværdi i SpEL-udtrykket. Vi får nogle standarder værdi for feltet, hvis systemegenskaben ikke er defineret:

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

Desuden kan vi bruge en feltværdi fra andre bønner. Antag, at vi har en bøn, der hedder someBean med et felt nogleVærdi svarende til 10. Derefter, 10 vil blive tildelt feltet:

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

Vi kan manipulere egenskaber for at få en Liste af værdier, her en liste over strengværdierne A, B og C:

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

5. Brug @Værdi Med Kort

Vi kan også bruge @Værdi kommentar til injektion a Kort ejendom.

Først skal vi definere egenskaben i {nøgle: 'værdi'} form i vores egenskabsfil:

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

Bemærk, at værdierne i Kort skal være i enkelte tilbud.

Nu kan vi indsprøjte denne værdi fra ejendomsfilen som en Kort:

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

Hvis vi har brug for det for at få værdien af ​​en bestemt nøgle i Kort, alt hvad vi skal gøre er tilføj nøglen navn i udtrykket:

@Value ("# {$ {valuesMap} .key1}") private Heltalsværdier MapKey1;

Hvis vi ikke er sikre på, om Kort indeholder en bestemt nøgle, skal vi vælge et sikrere udtryk, der ikke kaster en undtagelse, men indstiller værdien til nul når nøglen ikke findes:

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

Det kan vi også indstil standardværdier for de egenskaber eller nøgler, der muligvis ikke findes:

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

Kort poster kan også filtreres inden injektion.

Lad os antage, at vi kun skal hente de poster, hvis værdier er større end en:

@Value ("# {$ {valuesMap}.? [Værdi> '1']}") privat KortværdierMapFiltered;

Vi kan også bruge @Værdi kommentar til indsprøjt alle aktuelle systemegenskaber:

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

6. Brug @Værdi Med konstruktørinjektion

Når vi bruger @Værdi kommentar, vi er ikke begrænset til en feltinjektion. Vi kan også bruge det sammen med konstruktørinjektion.

Lad os 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 ovenstående eksempel indsprøjter vi en prioritet direkte ind i vores PriorityProvider'S konstruktør.

Bemærk, at vi også angiver en standardværdi, hvis ejendommen ikke findes.

7. Brug @Værdi Med Setter Injection

Analogt med konstruktionsinjektionen, vi kan også bruge @Værdi med setterinjektion.

Lad os se:

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

Vi bruger SpEL-udtrykket til at indsprøjte en liste over værdier i setValues metode.

8. Konklusion

I denne artikel undersøgte vi de forskellige muligheder for at bruge @Værdi kommentar med enkle egenskaber defineret i filen, med systemegenskaber og med egenskaber beregnet med SpEL-udtryk.

Som altid er eksempelapplikationen tilgængelig på GitHub-projektet.