Aký je rozdiel medzi anotáciami @Component, @Repository & @Service v jazyku Spring?

Môžu sa anotácie @Component, @Repository a @Service používať v systéme Spring zameniteľne, alebo okrem funkcie notačného prostriedku poskytujú nejakú konkrétnu funkcionalitu?

Inými slovami, ak mám triedu Service a zmením anotáciu z @Service na @Component, bude sa stále správať rovnako?

Alebo má anotácia vplyv aj na správanie a funkčnosť triedy?

Z dokumentácie k jari:

V Spring 2.0 a novších verziách je anotácia @Repository značkou pre

akúkoľvek triedu, ktorá spĺňa rolu alebo stereotyp (tiež známy ako Data Access Object alebo DAO) úložiska. Medzi použitia tejto značky patrí je automatický preklad výnimiek.

Spring 2.5 zavádza ďalšie stereotypné anotácie: @Component, @Service a @Controller. @Component je všeobecný stereotyp pre akýkoľvek komponentu spravovanú Springom. @Repository, @Service a @Controller sú špecializácie @Component pre špecifickejšie prípady použitia, napr. napríklad vo vrstvách perzistencie, služieb a prezentácie, v tomto poradí.

Preto môžete svoje triedy komponentov anotovať pomocou @Component, ale tým, že ich anotujete príponou @Repository, @Service alebo @Controller namiesto toho sú vaše triedy vhodnejšie na spracovanie nástrojmi alebo priradením k aspektom. Napríklad tieto stereotypné anotácie sú ideálnym cieľom pre pointcuts.

Ak sa teda rozhodujete medzi použitím @Component alebo @Service pre vašu vrstvu služieb, @Service je jednoznačne lepšou voľbou. Podobne, ako je uvedené vyššie, @Repository je už podporovaný ako značka pre automatický preklad výnimiek vo vašej vrstve perzistencie.

┌────────────┬─────────────────────────────────────────────────────┐
│ 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)      │
└────────────┴─────────────────────────────────────────────────────┘
Komentáre (12)

Sú takmer rovnaké - všetky znamenajú, že trieda je Spring bean. @Service, @Repository a @Controller sú špecializované @Component. Môžete si vybrať, či s nimi chcete vykonávať špecifické akcie. Napríklad:

  • @Controller beans používa spring-mvc
  • @Repository beans sú vhodné na preklad výnimiek z perzistencie

Ďalšou vecou je, že komponenty sémanticky označujete do rôznych vrstiev.

Jedna z vecí, ktorú ponúka @Component, je, že ňou môžete anotovať ďalšie anotácie a potom ich používať rovnakým spôsobom ako @Service.

Nedávno som napríklad vytvoril:

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

Takže všetky triedy s anotáciou @ScheduledJob sú spring beans a okrem toho sú registrované ako quartz jobs. Musíte len poskytnúť kód, ktorý spracuje konkrétnu anotáciu.

Komentáre (3)

Použitie anotácií @Service a @Repository je dôležité z hľadiska pripojenia k databáze.

  1. Používajte @Service pre všetky pripojenia k DB typu webová služba
  2. Používajte @Repository pre všetky vaše pripojenia k DB typu stored proc

Ak nepoužijete správne anotácie, môžete sa stretnúť s výnimkami commit overridden rollback transakciami. Počas záťažového testu uvidíte výnimky, ktoré súvisia s rollback transakciami JDBC.

Komentáre (2)