Voidaanko @Component
, @Repository
ja @Service
-merkintöjä käyttää Springissä vaihdellen vai onko niillä mitään erityistä toiminnallisuutta sen lisäksi, että ne toimivat merkintätapana?
Toisin sanoen, jos minulla on Service-luokka ja vaihdan annotaation @Service
:stä @Component
:iin, käyttäytyykö se edelleen samalla tavalla?
Vai vaikuttaako annotaatio myös luokan käyttäytymiseen ja toiminnallisuuteen?
Spring 2.0:ssa ja uudemmissa versioissa
@Repository
-merkintä on merkintä, joka tarkoittaa mikä tahansa luokka, joka täyttää roolin tai stereotyypin (tunnetaan myös nimellä Data Access Object tai DAO) tietovaraston (repository). Tätä merkintää käytetään muun muassa on poikkeusten automaattinen kääntäminen.Spring 2.5 esittelee lisää stereotyyppimerkintöjä:
@Component
,@Service
ja@Controller
.@Component
on yleinen stereotyyppi mille tahansa komponentille. Springin hallinnoima komponentti.@Repository
,@Service
ja@Controller
ovat seuraavat stereotypiat@Component
:n erikoistumismuodot erityisemmille käyttötapauksille, kuten esim. esimerkiksi pysyvyys-, palvelu- ja esityskerroksissa, vastaavasti.Siksi voit merkitä komponenttiluokkasi
@Component
:lla, mutta merkitsemällä ne@Repository
,@Service
tai@Controller
-merkinnöillä. sen sijaan luokkasi soveltuvat paremmin työkalujen käsittelyyn. tai yhdistettäväksi aspekteihin. Esimerkiksi nämä stereotyyppimerkinnät ovat ihanteellisia kohteita pointcutsille.Jos siis valitset, käytätkö
@Component
- vai@Service
-ominaisuutta luokkiin palvelukerroksen välillä,@Service
on selvästi parempi valinta. Vastaavasti, kuten edellä todettiin,@Repository
on jo tuettu merkintätapa seuraaville tiedostoille automaattista poikkeusten kääntämistä pysyvyyskerroksessasi.
┌────────────┬─────────────────────────────────────────────────────┐
│ 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) │
└────────────┴─────────────────────────────────────────────────────┘
Ne ovat lähes samat - kaikki ne tarkoittavat, että luokka on Spring-papu. @Service
, @Repository
ja @Controller
ovat erikoistuneita @Component
eja. Niillä voi halutessaan suorittaa tiettyjä toimintoja. Esimerkiksi:
@Controller
-papuja käytetään spring-mvc:ssä.@Repository
-pavut soveltuvat pysyvyyspoikkeusten kääntämiseen.Toinen asia on, että nimeät komponentit semanttisesti eri kerroksiin.
Yksi asia, jonka @Component
tarjoaa, on se, että voit annotoida sillä muita annotaatioita ja käyttää niitä sitten samalla tavalla kuin @Service
.
Esimerkiksi äskettäin tein:
@Component
@Scope("prototype")
public @interface ScheduledJob {..}
Eli kaikki @ScheduledJob
:lla annotoidut luokat ovat spring beaneja ja lisäksi ne on rekisteröity quartz jobsiksi. Sinun täytyy vain tarjota koodia, joka käsittelee kyseisen annotaation.
@Service
- ja @Repository
-merkintöjen käyttö on tärkeää tietokantayhteyden kannalta.
@Service
-merkintää kaikkiin verkkopalvelutyyppisiin tietokantayhteyksiin.@Repository
-merkintää kaikkiin tallennettuihin projektien tietokantayhteyksiin.Jos et käytä asianmukaisia merkintöjä, saatat joutua kohtaamaan sitoutumispoikkeuksia, jotka rollback-transaktiot ohittavat. Näet stressikuormitustestin aikana poikkeuksia, jotka liittyvät JDBC-tapahtumien palautukseen.