Merknader om vårbønner

Denne artikkelen er en del av en serie: • Spring Core Annotations

• Nettnotater om våren

• Kommentarer om vårstøvler

• Kommentarer om vårplanlegging

• Vårdataanmerkninger

• Spring Bean Annotations (nåværende artikkel)

1. Oversikt

I denne artikkelen vil vi diskutere mest vanlige merknader om vårbønner brukes til å definere forskjellige typer bønner.

Det er flere måter å konfigurere bønner i en Spring container. Vi kan erklære dem ved hjelp av XML-konfigurasjon. Vi kan erklære bønner ved hjelp av @Bønne kommentar i en konfigurasjonsklasse.

Eller så kan vi markere klassen med en av kommentarene fra org.springframework.stereotype pakken, og la resten være til komponentskanning.

2. Komponentskanning

Spring kan automatisk skanne en pakke for bønner hvis komponentskanning er aktivert.

@ComponentScan konfigurerer hvilke pakker for å skanne etter klasser med merkekonfigurasjon. Vi kan spesifisere navnene på basispakken direkte med et av basePackages eller verdi argumenter (verdi er et alias for basePackages):

@Configuration @ComponentScan (basePackages = "com.baeldung.annotations") klasse VehicleFactoryConfig {}

Vi kan også peke på klasser i basepakkene med basePackageClasses argument:

@Configuration @ComponentScan (basePackageClasses = VehicleFactoryConfig.class) klasse VehicleFactoryConfig {}

Begge argumentene er matriser slik at vi kan tilby flere pakker for hver.

Hvis ingen argumenter er spesifisert, skjer skanningen fra den samme pakken som @ComponentScan kommentert klasse er til stede.

@ComponentScan utnytter Java 8 gjentatte kommentarfunksjon, noe som betyr at vi kan merke en klasse med den flere ganger:

@Configuration @ComponentScan (basePackages = "com.baeldung.annotations") @ComponentScan (basePackageClasses = VehicleFactoryConfig.class) klasse VehicleFactoryConfig {}

Alternativt kan vi bruke @ComponentScans for å spesifisere flere @ComponentScan konfigurasjoner:

@Configuration @ComponentScans ({@ComponentScan (basePackages = "com.baeldung.annotations"), @ComponentScan (basePackageClasses = VehicleFactoryConfig.class)}) klasse VehicleFactoryConfig {}

Når ved hjelp av XML-konfigurasjon, konfigurering av komponentskanning er like enkelt:

3. @Komponent

@Komponent er en merknad på klassenivå. Under komponentskanningen, Spring Framework oppdager automatisk klasser som er merket med @Komponent.

For eksempel:

@Komponent klasse CarUtility {// ...}

Som standard har bønneinstansene i denne klassen det samme navnet som klassenavnet med små bokstaver. På toppen av det kan vi spesifisere et annet navn ved hjelp av det valgfrie verdi argumentet for denne kommentaren.

Siden @Oppbevaringssted, @Service, @Konfigurasjon, og @Kontrollør er alle metaanmerkninger av @Komponent, de deler samme bønneoppføringsatferd. Også plukker Spring dem automatisk opp under komponentskanningsprosessen.

4. @Oppbevaringssted

DAO- eller Repository-klasser representerer vanligvis databasetilgangslaget i et program, og skal merkes med @Oppbevaringssted:

@Repository class VehicleRepository {// ...}

En fordel med å bruke denne kommentaren er at den har automatisk oversettelse av persistens unntak aktivert. Når du bruker et vedvarende rammeverk som dvalemodus, er innfødte unntak kastet i klasser merket med @Oppbevaringssted vil automatisk bli oversatt til underklasser av Spring's DataAccessExeption.

For å aktivere unntaksoversettelse, må vi erklære våre egne PersistenceExceptionTranslationPostProcessor bønne:

@Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation () {return new PersistenceExceptionTranslationPostProcessor (); }

Merk at Spring i de fleste tilfeller gjør trinnet ovenfor automatisk.

Eller via XML-konfigurasjon:

5. @Service

De forretningslogikk av et program ligger vanligvis innenfor tjenestelaget - så vi bruker @Service kommentar for å indikere at en klasse tilhører det laget:

@Service offentlig klasse VehicleService {// ...}

6. @Kontrollør

@Kontrollør er en merknad på klassenivå som forteller Spring Framework at denne klassen fungerer som en kontroller i vår MVC:

@Controller offentlig klasse VehicleController {// ...}

7. @Konfigurasjon

Konfigurasjon klasser kan inneholder metoder for definisjon av bønner kommentert med @Bønne:

@Configuration class VehicleFactoryConfig {@Bean Engine engine () {return new Engine (); }}

8. Stereotype merknader og AOP

Når vi bruker Spring-stereotypkommentarer, er det enkelt å lage en snarvei som retter seg mot alle klasser som har en bestemt stereotype.

Anta for eksempel at vi vil måle utførelsestiden for metoder fra DAO-laget. Vi oppretter følgende aspekt (ved hjelp av AspectJ-merknader) ved å dra nytte av @Oppbevaringssted stereotype:

@Aspect @Component offentlig klasse PerformanceAspect {@Pointcut ("innenfor (@ org.springframework.stereotype.Repository *)") offentlig ugyldig repositoryClassMethods () {}; @Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint joinPoint) kaster Kastbar {lang start = System.nanoTime (); Object returnValue = joinPoint.proceed (); lang ende = System.nanoTime (); String methodName = joinPoint.getSignature (). GetName (); System.out.println ("Utførelse av" + methodName + "tok" + TimeUnit.NANOSECONDS.toMillis (slutt - start) + "ms"); return returnValue; }}

I dette eksemplet opprettet vi en snarvei som samsvarer med alle metodene i klassene som er merket med @Oppbevaringssted. Vi brukte @Rundt råd for deretter å målrette det snarveien og bestemme utførelsestiden for de avlyttede metodeanropene.

Ved å bruke denne tilnærmingen kan vi legge til logging, ytelsesadministrasjon, revisjon eller annen atferd i hvert applikasjonslag.

9. Konklusjon

I denne artikkelen har vi undersøkt vårens stereotype merknader og lært hvilken type semantikk disse representerer.

Vi lærte også hvordan man bruker komponentskanning for å fortelle containeren hvor man finner merkede klasser.

Til slutt - vi så hvordan disse kommentarene føre til et rent, lagvis design og skille mellom bekymringene til en søknad. De gjør også konfigurasjonen mindre, ettersom vi ikke lenger trenger å spesifikt definere bønner manuelt.

Som vanlig er eksemplene tilgjengelige på GitHub.

« Tidligere vårdatanoteringer