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?
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) │
└────────────┴─────────────────────────────────────────────────────┘
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šimtimisKitas 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ą.
Anotacijų @Service
ir @Repository
naudojimas yra svarbus prisijungimo prie duomenų bazės požiūriu.
@Service
visiems žiniatinklio paslaugų tipo DB prisijungimams.@@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.