Môžu sa anotácie @Component
, @Repository
a @Service
používať v systéme Spring zameniteľne, alebo okrem funkcie notačného prostriedku poskytujú nejakú konkrétnu funkcionalitu?
Inými slovami, ak mám triedu Service a zmením anotáciu z @Service
na @Component
, bude sa stále správať rovnako?
Alebo má anotácia vplyv aj na správanie a funkčnosť triedy?
V Spring 2.0 a novších verziách je anotácia @Repository
značkou pre
akúkoľvek triedu, ktorá spĺňa rolu alebo stereotyp (tiež známy ako Data Access Object alebo DAO) úložiska. Medzi použitia tejto značky patrí je automatický preklad výnimiek.
Spring 2.5 zavádza ďalšie stereotypné anotácie:
@Component
,@Service
a@Controller
.@Component
je všeobecný stereotyp pre akýkoľvek komponentu spravovanú Springom.@Repository
,@Service
a@Controller
sú špecializácie@Component
pre špecifickejšie prípady použitia, napr. napríklad vo vrstvách perzistencie, služieb a prezentácie, v tomto poradí.Preto môžete svoje triedy komponentov anotovať pomocou
@Component
, ale tým, že ich anotujete príponou@Repository
,@Service
alebo@Controller
namiesto toho sú vaše triedy vhodnejšie na spracovanie nástrojmi alebo priradením k aspektom. Napríklad tieto stereotypné anotácie sú ideálnym cieľom pre pointcuts.Ak sa teda rozhodujete medzi použitím
@Component
alebo@Service
pre vašu vrstvu služieb,@Service
je jednoznačne lepšou voľbou. Podobne, ako je uvedené vyššie,@Repository
je už podporovaný ako značka pre automatický preklad výnimiek vo vašej vrstve perzistencie.
┌────────────┬─────────────────────────────────────────────────────┐
│ 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) │
└────────────┴─────────────────────────────────────────────────────┘
Sú takmer rovnaké - všetky znamenajú, že trieda je Spring bean. @Service
, @Repository
a @Controller
sú špecializované @Component
. Môžete si vybrať, či s nimi chcete vykonávať špecifické akcie. Napríklad:
@Controller
beans používa spring-mvc@Repository
beans sú vhodné na preklad výnimiek z perzistencieĎalšou vecou je, že komponenty sémanticky označujete do rôznych vrstiev.
Jedna z vecí, ktorú ponúka @Component
, je, že ňou môžete anotovať ďalšie anotácie a potom ich používať rovnakým spôsobom ako @Service
.
Nedávno som napríklad vytvoril:
@Component
@Scope("prototype")
public @interface ScheduledJob {..}
Takže všetky triedy s anotáciou @ScheduledJob
sú spring beans a okrem toho sú registrované ako quartz jobs. Musíte len poskytnúť kód, ktorý spracuje konkrétnu anotáciu.
Použitie anotácií @Service
a @Repository
je dôležité z hľadiska pripojenia k databáze.
@Service
pre všetky pripojenia k DB typu webová služba@Repository
pre všetky vaše pripojenia k DB typu stored procAk nepoužijete správne anotácie, môžete sa stretnúť s výnimkami commit overridden rollback transakciami. Počas záťažového testu uvidíte výnimky, ktoré súvisia s rollback transakciami JDBC.