Kakšna je razlika med opombami @Component, @Repository & @Service v programu Spring?

Ali se lahko anotacije @Component, @Repository in @Service v pomladi uporabljajo izmenično ali poleg tega, da služijo kot pripomoček za zapisovanje, zagotavljajo kakšno posebno funkcionalnost?

Z drugimi besedami, če imam razred Service in spremenim anotacijo iz @Service v @Component, ali se bo še vedno obnašal enako?

Ali pa anotacija vpliva tudi na obnašanje in funkcionalnost razreda?

Iz Dokumentacija pomladi:

V različici Spring 2.0 in novejših je anotacija @Repository označevalec za

vsak razred, ki izpolnjuje vlogo ali stereotip (znan tudi kot Data Access Object ali DAO) skladišča. Ta označevalec se uporablja med drugim za je samodejno prevajanje izjem.

Spring 2.5 uvaja dodatne stereotipne opombe: @Component, @Service in @Controller. @Component je splošni stereotip za katero koli komponento, ki jo upravlja Spring. @Repository, @Service in @Controller so specializacije @Component za bolj specifične primere uporabe, npr. na primer v plasteh za obstojnost, storitve in predstavitev, oziroma.

Zato lahko svoje razrede komponent anotirate z @Component, vendar jih lahko anotirate z @Repository, @Service ali @Controller namesto tega so vaši razredi bolj primerni za obdelavo z orodji ali za povezovanje z vidiki. Na primer, te stereotipne anotacije so idealne tarče za točkovne izreze.

Če se torej odločate med uporabo @Component ali @Service za svojo storitveno plast, je @Service nedvomno boljša izbira. Podobno, kot je navedeno zgoraj, je @Repository že podprt kot označevalec za samodejno prevajanje izjem v vaši plasti persistence.

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

So skoraj enaki - vsi pomenijo, da je razred Springov fižol. @Service, @Repository in @Controller so specializirane @Component. Z njimi lahko izberete izvajanje posebnih dejanj. Na primer:

  • @Controller fižol uporablja spring-mvc
  • @Repository beans so primerni za prevajanje izjem persistence

Druga stvar je, da komponente semantično določite različnim plastem.

Ena od stvari, ki jo ponuja @Component, je, da lahko z njo anotirate druge anotacije in jih nato uporabite na enak način kot @Service.

Pred kratkim sem na primer naredil:

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

Torej so vsi razredi, ki so anotirani z @ScheduledJob, pomladanska zrna in poleg tega so registrirani kot kremenova opravila. Zagotoviti morate le kodo, ki obdeluje določeno anotacijo.

Komentarji (3)

Uporaba anotacij @Service in @Repository je pomembna z vidika povezave s podatkovno bazo.

  1. Uporabite @Service za vse povezave z DB, ki so tipa spletne storitve.
  2. Uporabite @Repository za vse svoje povezave s shranjenimi postopki DB

Če ne uporabljate ustreznih opomb, se lahko soočite z izjemami, ki jih nadomeščajo transakcije povratka. Med stresnim obremenitvenim testom boste videli izjeme, ki so povezane s transakcijami JDBC za vračanje.

Komentarji (2)