Wat's het verschil tussen @Component, @Repository &; @Service annotaties in Spring?

Kunnen @Component, @Repository en @Service annotaties door elkaar worden gebruikt in Spring of hebben ze een bepaalde functionaliteit naast het fungeren als een notatie apparaat?

Met andere woorden, als ik een Service class heb en ik verander de annotatie van @Service naar @Component, gedraagt deze zich dan nog hetzelfde?

Of heeft de annotatie ook invloed op het gedrag en de functionaliteit van de klasse?

Van Spring Documentation:

In Spring 2.0 en later is de @Repository annotatie een marker voor elke klasse die de rol of stereotype (ook bekend als Data Access Object of DAO) van een repository. Een van de toepassingen van deze marker is de automatische vertaling van exceptions.

Spring 2.5 introduceert nog meer stereotype annotaties: @Component, @Service, en @Controller. @Component is een generiek stereotype voor elk Spring-beheerde component. @Repository, @Service, en @Controller zijn specialisaties van @Component voor meer specifieke use-cases, bijvoorbeeld bijvoorbeeld, in de persistentie, service, en presentatie lagen, respectievelijk.

Daarom kun je je component classes annoteren met @Component, maar door ze te annoteren met @Repository, @Service, of @Controller in plaats daarvan zijn je klassen beter geschikt voor verwerking door tools of om te associëren met aspecten. Bijvoorbeeld, deze stereotype annotaties zijn ideale doelen voor pointcuts.

Dus, als je moet kiezen tussen het gebruik van @Component of @Service voor je service layer, @Service is duidelijk de betere keuze. Op dezelfde manier, zoals hierboven vermeld, @Repository wordt al ondersteund als een marker voor automatische exception vertaling in je persistentie laag.

┌────────────┬─────────────────────────────────────────────────────┐
│ Annotation │ Meaning                                             │
├────────────┼─────────────────────────────────────────────────────┤
│ @Component │ generic stereotype for any Spring-managed component │
│ @Repository│ stereotype for persistence layer                    │
│ @Service   │ stereotype for service layer                        │
│ @Controller│ stereotype for presentation layer (spring-mvc)      │
└────────────┴─────────────────────────────────────────────────────┘
Commentaren (12)

Ze zijn bijna hetzelfde - ze betekenen allemaal dat de klasse een Spring bean is. @Service, @Repository en @Controller zijn gespecialiseerde @Components. Je kunt ervoor kiezen om specifieke acties met ze uit te voeren. Bijvoorbeeld:

  • @Controller bonen worden gebruikt door spring-mvc
  • @Repository bonen komen in aanmerking voor persistentie uitzondering vertaling

Iets anders is dat je de componenten semantisch toewijst aan verschillende lagen.

Een ding dat @Component biedt is dat je er andere annotaties mee kunt annoteren, en ze dan op dezelfde manier kunt gebruiken als @Service.

Bijvoorbeeld onlangs heb ik gemaakt:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Dus alle classes die geannoteerd zijn met @ScheduledJob zijn spring beans en daarnaast worden ze geregistreerd als quartz jobs. Je hoeft alleen maar code te leveren die de specifieke annotatie afhandelt.

Commentaren (3)

Gebruik van @Service en @Repository annotaties zijn belangrijk vanuit database connectie perspectief.

  1. Gebruik @Service voor al je web service type DB connecties
  2. Gebruik @Repository voor al je stored proc DB connecties

Als je niet de juiste annotaties gebruikt, kun je te maken krijgen met commit uitzonderingen die overschreven worden door rollback transacties. U zult uitzonderingen zien tijdens stress load test die gerelateerd zijn aan roll back JDBC transacties.

Commentaren (2)