Spring Bean Annotations

Denne artikel er en del af en serie: • Spring Core Annotations

• Annoncer om foråret på nettet

• Kommentarer om forårstøvler

• Kommentarer om forårets planlægning

• Kommentarer om forårsdata

• Spring Bean Annotations (nuværende artikel)

1. Oversigt

I denne artikel vil vi diskutere mest almindelige Spring Bean-kommentarer bruges til at definere forskellige typer bønner.

Der er flere måder at konfigurere bønner i en Spring-container. Vi kan erklære dem ved hjælp af XML-konfiguration. Vi kan erklære bønner ved hjælp af @Bønne kommentar i en konfigurationsklasse.

Eller vi kan markere klassen med en af ​​kommentarerne fra org.springframework.stereotype pakke, og lad resten være til komponentscanning.

2. Komponentscanning

Spring kan automatisk scanne en pakke for bønner, hvis komponentscanning er aktiveret.

@ComponentScan konfigurerer hvilke pakker til at scanne efter klasser med annoteringskonfiguration. Vi kan specificere basispakkenavne direkte med et af basePackages eller værdi argumenter (værdi er et alias for basePackages):

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

Vi kan også pege på klasser i basispakkerne med basePackageClasses argument:

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

Begge argumenter er arrays, så vi kan levere flere pakker til hver.

Hvis der ikke er angivet noget argument, sker scanningen fra den samme pakke, hvor @ComponentScan kommenteret klasse er til stede.

@ComponentScan udnytter Java 8 gentagne annotationsfunktion, hvilket betyder, at vi kan markere en klasse med den flere gange:

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

Alternativt kan vi bruge @ComponentScans for at angive flere @ComponentScan konfigurationer:

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

Hvornår ved hjælp af XML-konfiguration, den konfigurerende komponentscanning er lige så let:

3. @Komponent

@Komponent er en klassebeskrivelse. Under komponentscanningen, Spring Framework registrerer automatisk klasser, der er kommenteret med @Komponent.

For eksempel:

@Komponent klasse CarUtility {// ...}

Som standard har bønneforekomsterne i denne klasse det samme navn som klassens navn med små bogstaver. Oven i det kan vi angive et andet navn ved hjælp af det valgfri værdi argumentet for denne kommentar.

Siden @Repository, @Service, @Konfigurationog @Kontrol er alle metanoteringer af @Komponent, de deler den samme adfærd for navngivning af bønner. Spring samler dem også automatisk op under komponentscanningsprocessen.

4. @Repository

DAO- eller Repository-klasser repræsenterer normalt databaseadgangslaget i en applikation og skal kommenteres med @Repository:

@Repository klasse VehicleRepository {// ...}

En fordel ved at bruge denne kommentar er, at den har automatisk oversættelse af persistensundtagelse aktiveret. Når du bruger en persistensramme som f.eks. Dvale, annoteres indfødte undtagelser inden for klasser med @Repository vil automatisk blive oversat til underklasser af Spring's DataAccessExeption.

For at aktivere undtagelsesoversættelse, vi er nødt til at erklære vores egne PersistenceExceptionTranslationPostProcessor bønne:

@Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation () {returner ny PersistenceExceptionTranslationPostProcessor (); }

Bemærk, at Spring i de fleste tilfælde udfører ovenstående trin automatisk.

Eller via XML-konfiguration:

5. @Service

Det forretningslogik af en applikation findes normalt inden for servicelaget - så vi bruger @Service kommentar for at indikere, at en klasse hører til dette lag:

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

6. @Kontrol

@Kontrol er en klassebemærkning, der fortæller Spring Framework, at denne klasse fungerer som en controller i Spring MVC:

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

7. @Konfiguration

Konfiguration klasser kan indeholder metoder til definition af bønner kommenteret med @Bønne:

@Configuration klasse VehicleFactoryConfig {@Bean Engine motor () {returner ny motor (); }}

8. Stereotype bemærkninger og AOP

Når vi bruger Spring stereotype annotationer, er det let at oprette en genvej, der er målrettet mod alle klasser, der har en bestemt stereotype.

Antag for eksempel, at vi vil måle udførelsestiden for metoder fra DAO-laget. Vi opretter følgende aspekt (ved hjælp af AspectJ-kommentarer), der udnytter @Repository stereotype:

@Aspect @Component offentlig klasse PerformanceAspect {@Pointcut ("indenfor (@ org.springframework.stereotype.Repository *)") offentlig ugyldig repositoryClassMethods () {}; @Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint joinPoint) throw Throwable {long start = System.nanoTime (); Objekt returnValue = joinPoint.proceed (); lang ende = System.nanoTime (); String methodName = joinPoint.getSignature (). GetName (); System.out.println ("Udførelse af" + methodName + "tog" + TimeUnit.NANOSECONDS.toMillis (slutstart) + "ms"); return returnValue; }}

I dette eksempel oprettede vi en genvej, der matcher alle metoder i klasser, der er kommenteret med @Repository. Vi brugte @Rundt om råd til derefter at målrette denne genvej og bestemme udførelsestiden for de aflyttede metodekald.

Ved hjælp af denne tilgang kan vi tilføje logning, performance management, revision eller anden adfærd til hvert applikationslag.

9. Konklusion

I denne artikel har vi undersøgt stereotype annoteringer om foråret og lært, hvilken type semantik disse hver repræsenterer.

Vi lærte også, hvordan man bruger komponentscanning til at fortælle containeren, hvor man kan finde annoterede klasser.

Endelig - vi så, hvordan disse kommentarer føre til et rent, lagdelt design og adskillelse mellem bekymringerne ved en ansøgning. De gør også konfigurationen mindre, da vi ikke længere har brug for eksplicit at definere bønner manuelt.

Som sædvanligt er eksemplerne tilgængelige på GitHub.

« Tidligere forårsdata-bemærkninger