Kuo skiriasi @Component, @Repository & amp; @Service anotacijos "Spring" programoje?

Ar @Component, @Repository ir @Service anotacijos gali būti naudojamos tarpusavyje "Spring" programoje, ar jos turi kokią nors konkrečią funkciją, išskyrus tai, kad yra tik užrašymo priemonė?

Kitaip tariant, jei turiu paslaugų klasę ir pakeisiu anotaciją iš @Service į @Component, ar ji vis tiek elgsis taip pat?

O gal anotacija taip pat turi įtakos klasės elgsenai ir funkcionalumui?

Pavasario dokumentacija:

Pavasaryje 2.0 ir vėlesnėse versijose anotacija @Repository yra žymuo, skirtas

bet kuri klasė, atitinkanti vaidmenį arba stereotipą (dar vadinamą Data prieigos objektas arba DAO) saugyklos tipą. Šis žymeklis naudojamas, pvz. yra automatinis išimčių vertimas.

Pavasaris 2.5 pristato daugiau stereotipų anotacijų: @Component, @Service ir @Controller. @Component yra bendras stereotipas, skirtas bet kokiam Spring valdomą komponentą. @@Repository, @Service ir @Controller yra @Component specializacijos, skirtos konkretesniems naudojimo atvejams, pvz. pavyzdžiui, atkaklumo, paslaugų ir pateikimo sluoksniuose, atitinkamai.

Todėl savo komponentų klases galite anotuoti su @Component, bet anotuodami jas su @Repository, @Service arba @Controller vietoj to, jūsų klasės bus labiau pritaikytos apdoroti įrankiais arba susieti su aspektais. Pavyzdžiui, šios stereotipų anotacijos idealiai tinka taškų raktams.

Taigi, jei renkatės tarp @Component ar @Service naudojimo savo paslaugų sluoksnį, @Service yra akivaizdžiai geresnis pasirinkimas. Panašiai, kaip minėta pirmiau, @Repository jau palaikomas kaip žymuo automatiniam išimčių vertimui jūsų persistencijos sluoksnyje.

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

Jie beveik vienodi - visi jie reiškia, kad klasė yra "Spring" pupelė. @Service, @Repository ir @Controller yra specializuotos @Component. Su jomis galima pasirinkti atlikti konkrečius veiksmus. Pavyzdžiui:

  • @Controller pupelės naudojamos spring-mvc
  • @Repository pupelės gali būti verčiamos persistencijos išimtimis

Kitas dalykas - komponentus semantiškai priskirkite skirtingiems sluoksniams.

Vienas dalykas, kurį suteikia @Component, yra tai, kad juo galite anotuoti kitas anotacijas ir tada naudoti jas taip pat, kaip ir @Service.

Pavyzdžiui, neseniai padariau:

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

Taigi visos klasės, anotuotos su @ScheduledJob, yra spyruoklinės pupelės, be to, registruotos kaip kvarco darbo vietos. Jums tereikia pateikti kodą, kuris tvarko konkrečią anotaciją.

Komentarai (3)

Anotacijų @Service ir @Repository naudojimas yra svarbus prisijungimo prie duomenų bazės požiūriu.

  1. Naudokite @Service visiems žiniatinklio paslaugų tipo DB prisijungimams.
  2. Naudokite @@Repository visiems saugomų proc tipo DB prisijungimams.

Jei nenaudosite tinkamų anotacijų, galite susidurti su išimtimis, kurias panaikina grįžtamosios transakcijos. Atlikdami apkrovos testą pamatysite išimtis, susijusias su JDBC grįžtamaisiais sandoriais.

Komentarai (2)