Mitä eroa on @Componentin, @Repository & @Service-merkintöjen välillä Springissä?

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 Documentation:

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)      │
└────────────┴─────────────────────────────────────────────────────┘
Kommentit (12)

Ne ovat lähes samat - kaikki ne tarkoittavat, että luokka on Spring-papu. @Service, @Repository ja @Controller ovat erikoistuneita @Componenteja. 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.

Kommentit (3)

@Service- ja @Repository-merkintöjen käyttö on tärkeää tietokantayhteyden kannalta.

  1. Käytä @Service-merkintää kaikkiin verkkopalvelutyyppisiin tietokantayhteyksiin.
  2. Käytä @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.

Kommentit (2)