Egyszerű tavaszi alkalmazást kommentárok @autowired
Az előző bejegyzésben létrehoztunk egy egyszerű rugó alkalmazása. kötni a komponenseket használtuk a konfigurációs XML fájl. De ez a megközelítés, hogy az xml fájl alapján a régi stílusú Spring azaz a tavaszi annatatsionnyh alkalommal. Ebben a bejegyzésben fogjuk fel ugyanazt az alkalmazást, csak kötni a babot fogja használni anntoatsii, hanem kommentár @Autowired. Minden bevezető elmélet hogyan Spring nyithat az előző bejegyzésben. Ez csak pont különbség a megközelítés megteremtése springovogo alkalmazás, amely kommunikál a konfigurációs xml fájlt springovogo alkalmazás, amely megköti az összefoglaló @Autowired.
Mivel ezen a poszton fogok beszélni részletesen a tavasz, így kiderült, egy kicsit hosszabb, akik szeretnének egy leírást rövid és egyenesen arra a pontra, akkor vizsgálja meg a Tavaszi utáni dióhéjban
Ebben a példában, szükségünk lesz:
Az elkészült projekt egy egyszerű tavaszi alkalmazás letölthető az alábbi linken:
sturkture projekt
Miután összeadjuk az összes szükséges fájlt az adott alkalmazás és fuss build.sh script az aktuális könyvtárban, a könyvtár lesz építeni. a szerkezet a begyűjtött alkalmazás:
Régi tavaszi stílusú
Először egy egyszerű példát a Tavaszi alkalmazás predudschego böjt, amikor a kötő komponensek használjuk xml fájlt:
Figure.java
Circle.java
Rectangle.java
Print.java
Execute.java
Abstract @Autowired
Minden osztályban van ugyanaz, mint az előző bejegyzésben, egy egyszerű tavaszi alkalmazást. Ebben a bejegyzésben meg fogja változtatni őket egy kicsit, vagy inkább valami hozzá. De először is, nézd meg megint a konfigurációs fájl context.xml az utolsó utáni, már emelt egy egyszerű rugó alkalmazása. Ügyeljen arra, hogy a huszadik helye:
context.xml
Ebben a sorban a bin kör társított bab nyomtatás. Ahhoz, hogy bin kör tulajdonított bab nyomtatás. mi meg a bin kör ingatlan ábra bab nyomtatásban. Ez azt jelenti, hogy ha eltávolítjuk a kötési vonal, a bin kiírja a kör nélkül, és a kimeneti lesz semmi. Ahhoz, hogy bin cirlce még kötve egy bab nyomtatási tehet másként, proannotiruem területén ábra kommentár @Autowired. és tag
(Azaz a huszadik vonal) dobja a konfigurációs fájlban, vagyis az, abban a pillanatban Print.java osztály néz ki (a hozzáadott annotáció @Autowired a hetedik sornak):
Print.java
és context.xml konfigurációs fájl így néz ki:
context.xml
BeanPostProcessor, egyedi és nekastomnye (springovye) bab
Az előző konfigurációs fájl context.xml rögzített három bab: kör. téglalap és nyomtatás. Megjegyezzük, hogy a kötődés az alkatrészek nem ment sehova, akkor egyszerűen át a konfigurációs fájlt Print.java osztály és most át kommentár @Autowired (az előző tőzsdei Print.java 7-es vonal). Tehát ez? Nem tudom, lássuk. Gyűjtés projektcsapat ./build.sh:
És mi történt? A kimenet azt látjuk, hogy a babot hoztak létre, de amikor megpróbálja felhívni showSquare () metódus repült NPE.
Ha megnézzük ezt a hibát, akkor feltételezhető, hogy kísérletet teszünk razrezolvit mutató null showSquare () metódust. Így ez történik, a showSquare () módszer. felhívást intézett a szám mezőben. de üres. Ez azt jelentheti, hogy a kör nem avtopodvyazalsya binenként nyomtatás. De mi a baj? Van @Autowired kommentárok kicsit? Kiderült, hogy igen. Az a tény, hogy már jelezte a kommentár @Autowired. Felnyársalta de nem tud semmit, így a bab automatikusan kötözve, szükséges, hogy a tavaszi értesíti. Tavaszi put értesíteni kommentárok @Autowired hozzátéve bab összefüggésben
Az ezt követő vitában azt fogjuk feltételezni, hogy a bab feltalált és felnevelt minket ez az egyéni tartályok és ládák springovoy springovye könyvtárban. Mit csinálunk most? Adtunk springovy bin (ez springovy, nem egyéni) AutowiredAnnotationBeanPostProcessor BeanPostProcessor, amely megvalósítja a felület és a tavaszi babot létre először, mert Bina, aki beállította a többi bab. Azaz, először vet minden tavaszi babot, hogy végre BeanPostProcessor felületet. majd idején létrehozása és konfigurálása Spring mi (egy egyéni) Bina, BeanFactory (BeanFactory a gyár, hogy a bab) létrehoz egy egyéni bin, aztán (Spring) átadja (egyéni bin) feldolgozására bab végrehajtja BeanPostProcessor felület ebben az esetben, ez bin AutowiredAnnotationBeanPostProcessor (springovy bin). Ismét AutowiredAnnotationBeanPostProcessor bin már előre létrehozott Spring előtt (Spring) létrehozott egy egyéni bin. A AutowiredAnnotationBeanPostProcessor megvalósított logika, amely megkeresi az összes jegyzetekkel területén kommentár @Autowired keresztül reflekshen teszi őket valami, például egy másik edénybe. Ezután, amikor a feldolgozás egy egyéni bab bab posztprocesszor kezelt bin (mivel prosechenymi mezők) rugóvisszaállítás (vagy inkább a BeanFactory), és a tavaszi, van egy kész bin fogalmaz egy tartályban.
Adtunk springovy bin AutowiredAnnotationBeanPostProcessor. de kezeli Csak a bevezető @Autowired. hogy ha az osztály bemutatjuk egyéb megjegyzését, mint @Required vagy több? Mindegy, ha az elvont @Required. majd feldolgozza a bab posztprocesszor org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor kérdés, hogy mennyire kell tudni, hogy a különböző bab utáni processzorok felveendő keretében minden kommentár? Ahhoz nem kell megjegyeznie mindet, és mi is hozzá a vonatkozásban, hogy neymspeys kontextusban: kommentár-config, hogy mindez meg fog tenni nekünk. Ehelyett annak érdekében, hogy írjon mindezen hosszú neveket bab utáni processzorok a konfiguráció, akkor írj:
E címke pryachyutsya iksemel címkék adunk keretében minden bab utáni feldolgozók minden springovyh kommentárokat.
Add ezt a címkét a konfigurációs fájlban. Így kell kinéznie a konfigurációs fájlban:
context.xml
Fuss a projekt, ha a szerelvény ./build.sh csapat. Látjuk, hogy a ládákat emelnek, de ismét repül eksepshen, ezúttal BeanCreationException:
Nos, megint, nem? Megvizsgálva néhány naplók, akkor figyelni ezt az üzenetet:
Azaz Spring azt mondja, hogy ő nem tudja, hogyan kell kötni com.devblogs.component.figure.Figure bab területén egy kör vagy téglalap. Minden jó lenne, ha csak egy bin típusú ábra. de közülük kettő, mindkettő chaildami típusú ábra. Tavaszi pillanatnyilag nem tudja, hogyan babosztály Print nyakkendő, így tavasszal nem indul. Spring tud társulni egy osztály nyomtatás minden bab lehet távolítani a konfigurációs fájl a regisztrációs bármelyike a tartályokat vagy kör vagy téglalap. Ebben az esetben, az egyik közülük már nem bab és a bab, hogy továbbra is lesz az egyetlen bab, amely örökli az ábrából, és akkor működni fog. De mi nem vagyunk elégedettek ezzel a lehetőséggel, mert azt akarjuk, hogy, mi volt mind a kukába, és lekötni a mező ábrán csak az egyiket. Tavaszi nem erőlködnie, hogy a bin válasszuk ki, azt kell mondani neki, hogy mit kell tenni egy konkrét bin ábra területén. Ez használ absztrakt @Qualifier. mely szerint egy tavaszi bab kell neki ezt a mezőt. Add az osztály kommentár Print.java @Qualifier nevével együtt a bab, amit zárójelben, amely összekapcsolja a tavaszi mező ábra. Most Print.java class kell kinéznie:
Print.java
Itt van szó segítségével Spring @Qualifier jelöléseket (9-es vonal), hogy bin kör tenni a bin nyomtatásban. Szintén fontos megjegyezni, hogy Print.java osztályban már nincs készlet eljárás mező ábra. Ez nem azért, mert most tavaszi prosechivaet alak területen keresztül reflexió.
Ha már az egészet előre csapat ./build.sh mindennek jól kell működnie hiba nélkül, és a kimeneti meg kell látnunk a terület a kör, mert az eljárás alak mutató showSquare () végre megtalálta a memóriában a tárgy kör:
Ugyanaz, mint a kulcsszó
vagyis eltekintve kívül az összes szükséges bab utáni processzorok összefüggésben azt is átvizsgálja csomagok jelenlétére kommentárok @Component vagy @Service.
Tag kontextusban: alkatrész-scan ellenőrzi bizonyos csomagot vagy egy adott csomagot és úgy néz ki a babot, és az is, hogy létre fog hozni. Mit jelent ez? Ez azt jelenti, hogy a konfigurációs fájlt, akkor kihagyja az explicit meghatározása bin változó ezt az eljárást Spring, beleértve azokat is, ládákat igénylő kivitelező paramétereket, de egy kicsit tovább ezt, és közben lehetőség konstrukciók bab kör és négyszög inicializálni egy konfigurációs fájl, de a bab meghatározás nyomtatási tudjuk eltávolítani a konfigurációs fájlban. Távolítsuk el a bab meghatározás nyomtasson egy konfigurációs fájl context.xml és a konfigurációs fájl a következőképpen néz ki:
context.xml
Most context.xml konfigurációs fájl áll csak két meghatározások babot és egy címkét kontextusban: alkatrész-scan.
És most a megváltozott konfigurációs fájl futtatásához építmények skrpit build.sh:
Az előző kimenet jelzi, hogy a két bab kör és a téglalap létrehozása sikeres volt, de abban a szakaszban, hogy létrehozza a bab nyomtatásban. Csak az a dolog, hogy már dobott ki egy konfigurációs fájl, az alkalmazás zafeylili 🙁. Eksepshen NoSuchBeanDefinitionException azt mondja, hogy tavasz nem találtunk bin nyomtatási összefüggéseiben, de nem azért, mert nem jött létre. De mit jelent ez? Alig haladta meg azt írtam, hogy ha dobja bab definícióját a konfigurációs fájl, akkor megszűnik a bab. Itt van, mi történt. Nos, mi van a címke
Ha ő nem tett a tavaszról beolvasott com.devblogs.component csomag (és az összes csomagot alatta) a bab? Válasz Spring beolvasott a csomagokat, de nem talált semmit. Miért? Nézzük foglalkozik tovább.
A kommentárok @Service és @Component
A tavasz nem található a bin táskák, mert szerintük (rugós és vélemény a végső hatóság) nincsenek ott. Nézzük újra Print.java osztály (jól értem, már sokszor mondtam ma nézett, és még egyszer):
Print.java
Meg tudja érteni belőle, hogy ez a bin vagy alkatrész tavasz? Ez Spring nem tud, és az a tény, hogy vannak olyan megjegyzések @Autowired @Qualifier, és ez nem az a tény, hogy ez egy komponens. Tavaszi szüksége garantálja, hogy ez a komponens. Mert ez az elméleti, amely az úgynevezett @Component vagy @Service. Csak annyit kell tennie, hogy adjunk egy feljegyzést @Component előtt az osztály nevét.
Ellentétben kommentárok @Service származó @Component kommentárok
A kommentárok @Service és @Component cserélhető. Mindkét kommentárokban Spring, hogy az osztály, amely felett ők viselik a bab, hogy egy jelölt automatikus felismerés, ha a konfigurációs fájl elhelyezett címke kontextusban: annotáció-config és a címke automatikus keresés kontextusban: alkatrész-scan, vagy csak tag kontextusban: alkatrész-scan. A különbség a kettő között csak az ötletet, hogy az annotált osztály. Jegyzet @Service jobb alkalmazni a bab, amely a szolgáltatás más tartályok. Abstract @Component legalkalmasabbak a bab-tulajdonságokkal. vagyis e rekeszek, amelyek ingatlan értékének más tartályokat, ahelyett hogy a végrehajtás a kódot, amelynek eredményei különböző ládákat. De ez csak egy ajánlás, szigorúan kövesse ezeket az ajánlásokat nem kényszerülnek az alábbi példák fogják használni elsősorban elméleti @Component. akkor is, ha az osztály biztosítja az üzleti logika. [102]
Abstract @Component jelzi az osztályt komponenseként Spring. Add ezt a jelölést az elején, mielőtt a nevét az osztály osztály Print.java így nézett ki:
Print.java
Most próbáljuk meg még egyszer, hogy összegyűjtse és előre történő alkalmazásáról ./build.sh csapat:
Ekkor az alkalmazás ranitsya hiba nélkül. Most, hogy ebben a szakaszban van. Miután a Tavaszi talált a konfigurációs fájlban tag kontextusban: alkatrész-scan. kezdi a folyamat találni bab, keresi minden osztályban a csomagban, ami meg van adva a tag. Nézzük Tavaszi néz Print.java osztályban. Ebben azt állapítja meg egy feljegyzést @Component. és arra a következtetésre jut, hogy ez a bin. Ezután létrehoz egy példányt, és összeköti őket bin kör jött létre manuálisan a konfigurációs fájlban context.xml. Sőt, ha nem a kivitelező paraméterek soha nem tudtuk érzékelni semmit a konfigurációs fájlban, és adjunk hozzá csak egy címke
és ő mindent megtett. Sőt, még inicializálási kivitelező paramétert lehet átadni a konfigurációs fájlt az osztályban, mint tettük a inicializáló tulajdonságok kitalálni.
Abstract @Value
Ez a szakasz mellett a korábbi, a gyakorlatban, a kezdeti paramétereket osztályok valaha gyártott, ez a rész foglalkozik a legtöbbet, mert lehet, hogy nem, de nem is kell csinálni. így megy közvetlenül innen építeni a projekt.
Annak érdekében, hogy át az inicializálási kivitelező paramétereket (vagy módszer) egy konfigurációs fájlt az osztályban erre a célra, a két Abstracts, amely vagyunk már ismert @Autowired. és a többi @Value. Most, hogy vessük el a többi konfigurációs fájl context.xml bab meghatározások:
és hagyja csak a tag
Most context.xml konfigurációs fájl amely csupán egyetlen tag kontextusban: alkatrész-scan:
context.xml
Mivel a konfigurációs fájl egyszerűsített, hogy egy sorban
De ez még nem minden. Megteheti konfigurációs fájl nélkül és használni egy objektumot, ami létrejön a AnnotationConfigApplicationContext mein módszer alkalmazása. Ezt a feladatot át a csomagot, amely elkezdi olvasni a jelenléte kommentár osztályok @Component, és húzza ki belőle a babot. Ebben az esetben a konfigurációs fájl context.xml szükségtelenné válik, hiszen minden azt mondja, hogy nem, volna objektum AnnotationConfigApplicationContext. azaz, megtalálása és megteremtése a bab.
De a java osztályokat és Circle.java Rectangle.java nem a formális paraméterek jegyzetekkel kommentár kivitelező @Value jelzi zárójelben azt az értéket szeretnénk átadni a kivitelező, valamint a kivitelező jegyzetekkel mintegy @Autowired. és mivel már dobott bab meghatározások kör és téglalap alakú context.xml konfigurációs fájlban. szükséges jegyzetekkel többet ezen osztályok jegyzetekkel @Component. Megváltozott osztályok Circle.java Rectangle.java és így kell kinéznie:
Circle.java
Rectangle.java
Itt az eset, amikor az átruházás az összes konfigurációs fájlt a Java-osztály már nem akadály, mint segítség. A tény az, hogy annak érdekében, hogy módosítsa az értéket a kivitelező paraméterek újra kell fordítani a projekt ismét, bár mi használ Spring fordítva elkerülni. Ezért vényköteles konfiguráció Java osztály bizonyítani, hogy meg tudod csinálni, de az élet jobb nem megtenni. Azaz, a Java osztály megadhatja a tavaszi, hogy itt meg kell végrehajtani egy másik bin, vagy azt, hogy a kapcsolatot ebben az osztályban van szükség, mint a bab, de a konfigurációs adatokat jobban bírja túl a kódot határértékeket külön xml file, ebben az esetben, az adatok alapján a centralizált és ha meg kell változtatni valamit, mi kerülhet a konfigurációs fájlt, és csípés valamit, és a módosítások azonnal érvényesüljenek, újrafordítás nélkül.
Mindezt összerakva
Nos, ez minden, most hozza ismét minden osztály egy konfigurációs fájl, miután az összes változtatások (kiemelve):