Ebben a cikkben nem fogom elmondani, hogyan lehet egy működő tavaszi projektet 5 perc alatt elindítani a kódom segítségével. Csak az alapokat fogom leírni – olyan dolgokat, amelyekről lehet, hogy nem tud, és mégis létrehoz egy projektet. Ebben a cikkben azonban még mindig nem fogja megérteni, mi történik, és ami még fontosabb, miért.
Mint látható, a tavasz moduláris. Ez lehetővé teszi, hogy csak azokat a modulokat csatlakoztassuk, amelyekre szükségünk van az alkalmazásunkhoz, nem pedig azokat, amelyeket nyilvánvalóan nem fogunk használni. Amennyire én tudom, ez a megközelítés tette lehetővé, hogy a Spring felülmúlja akkori versenytársát (EJB), és átvegye a vezetést. Az EJB-t használó alkalmazások sok függőséget húztak maguk mögött, és ennek eredményeként lomhának és lassúnak bizonyultak. A képen látható, hogy a Spring Framework több modulból áll:
Mi a tavaszi keretrendszer?
A Spring Framework vagy egyszerűen a Spring az egyik legnépszerűbb keretrendszer a webalkalmazások Java nyelven történő létrehozásához. A keretrendszer olyan, mint egy könyvtár (talán Ön jobban ismeri ezt a kifejezést), de van valami, amit figyelembe kell venni. Durván fogalmazva, amikor egy könyvtárat használ, egyszerűen létrehozza az abban található osztályok példányait, meghívja a szükséges metódusokat, és így megkapja a kívánt eredményt. Más szóval, ez inkább kötelező megközelítés: a programodban kifejezetten megjelölöd azt a konkrét pillanatot, amikor melyik objektumot kell létrehoznod, mikor melyik konkrét metódust kell meghívni stb. A keretrendszerekkel a dolgok kissé eltérnek. Egyszerűen írsz néhány saját osztályt, és írsz beléjük néhány logikát, de aztán maga a keretrendszer létrehozza az osztályaid példányait, és meghívja a metódusaikat. Az Ön osztályai általában implementálnak néhány interfészt a keretrendszerből, vagy öröklik annak egyes osztályait, így biztosítva az Ön számára már megírt funkciókat. De ez nem mindig van így. Például a Spring a lehető legnagyobb mértékben megpróbálja elkerülni az ilyen szoros csatolást (ahol az osztályok közvetlenül függnek a keretrendszer osztályaitól/interfészeitől). Ennek eléréséhez megjegyzéseket használ. Erre később visszatérünk. De fontos megérteni, hogy a Spring csak egy olyan osztályok és felületek gyűjteménye, amelyek elérhetőek az Ön számára :) Azonnal szeretném megjegyezni, hogy a Spring nem csak webes alkalmazásokhoz használható, hanem a legelterjedtebb konzolprogramokhoz is amelyek olyan ismerősek mindannyiunk számára. És még ma is írunk egyet belőlük. így biztosítva Önnek néhány olyan funkciót, amelyet már megírtak Önnek. De ez nem mindig van így. Például a Spring a lehető legnagyobb mértékben megpróbálja elkerülni az ilyen szoros csatolást (ahol az osztályok közvetlenül függnek a keretrendszer osztályaitól/interfészeitől). Ennek eléréséhez megjegyzéseket használ. Erre később visszatérünk. De fontos megérteni, hogy a Spring csak egy olyan osztályok és felületek gyűjteménye, amelyek elérhetőek az Ön számára :) Azonnal szeretném megjegyezni, hogy a Spring nem csak webes alkalmazásokhoz használható, hanem a legelterjedtebb konzolprogramokhoz is amelyek olyan ismerősek mindannyiunk számára. És még ma is írunk egyet belőlük. így biztosítva Önnek néhány olyan funkciót, amelyet már megírtak Önnek. De ez nem mindig van így. Például a Spring a lehető legnagyobb mértékben megpróbálja elkerülni az ilyen szoros csatolást (ahol az osztályok közvetlenül függnek a keretrendszer osztályaitól/interfészeitől). Ennek eléréséhez megjegyzéseket használ. Erre később visszatérünk. De fontos megérteni, hogy a Spring csak egy olyan osztályok és felületek gyűjteménye, amelyek elérhetőek az Ön számára :) Azonnal szeretném megjegyezni, hogy a Spring nem csak webes alkalmazásokhoz használható, hanem a legelterjedtebb konzolprogramokhoz is amelyek olyan ismerősek mindannyiunk számára. És még ma is írunk egyet belőlük. A Spring a lehető legnagyobb mértékben igyekszik elkerülni az ilyen szoros csatolásokat (ahol az osztályok közvetlenül függenek a keretrendszer osztályaitól/interfészeitől). Ennek eléréséhez megjegyzéseket használ. Erre később visszatérünk. De fontos megérteni, hogy a Spring csak egy olyan osztályok és felületek gyűjteménye, amelyek elérhetőek az Ön számára :) Azonnal szeretném megjegyezni, hogy a Spring nem csak webes alkalmazásokhoz használható, hanem a legelterjedtebb konzolprogramokhoz is amelyek olyan ismerősek mindannyiunk számára. És még ma is írunk egyet belőlük. A Spring a lehető legnagyobb mértékben igyekszik elkerülni az ilyen szoros csatolásokat (ahol az osztályok közvetlenül függenek a keretrendszer osztályaitól/interfészeitől). Ennek eléréséhez megjegyzéseket használ. Erre később visszatérünk. De fontos megérteni, hogy a Spring csak egy olyan osztályok és felületek gyűjteménye, amelyek elérhetőek az Ön számára :) Azonnal szeretném megjegyezni, hogy a Spring nem csak webes alkalmazásokhoz használható, hanem a legelterjedtebb konzolprogramokhoz is amelyek olyan ismerősek mindannyiunk számára. És még ma is írunk egyet belőlük. ) Azt is szeretném rögtön megjegyezni, hogy a Spring nem csak webes alkalmazásokhoz használható, hanem a legelterjedtebb, mindannyiunk számára oly ismerős konzolprogramokhoz is. És még ma is írunk egyet belőlük. ) Azt is szeretném rögtön megjegyezni, hogy a Spring nem csak webes alkalmazásokhoz használható, hanem a legelterjedtebb, mindannyiunk számára oly ismerős konzolprogramokhoz is. És még ma is írunk egyet belőlük.Szerkezet
De a tavasz nem csak egy bizonyos keret. Inkább ez egy elterjedt elnevezés, amely több kis keretrendszerre utal, amelyek mindegyike saját feladatot lát el.https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
2.1. ábra. A tavaszi keret áttekintése
- Adat hozzáférés
- Web
- Mag
- és több
Miért van a Java Spring Framework-je?
Nos, amellett, hogy divatos, sima és friss, már most elmondhatom, hogy amint egy kis készségre is szert tesz a Spring használatában, megérti, hogy van mindenféle munka, ami már nincs. tenni, és mennyi munkát vállal magára a tavasz. Írhat néhány tucat sor konfigurációs beállítást és írhat néhány osztályt, és a végén egy működő projektet kap. De amint elkezd azon tűnődni, hogy mennyi cucc van a motorháztető alatt, mennyi munka folyik, és mennyi kódot kellene írnod, ha ugyanazt a projektet sima szervletekre vagy socketekre és tiszta Java-ra építenéd, égnek fog állni a hajad :) A tavaszt még egyfajta varázslatként is leírják. Ezt akkor tapasztalod, amikor látod, hogy minden működik, de van egy hozzávetőleges elképzelésed is arról, hogyan és mennyi munka zajlik a színfalak mögött – tehát úgy tűnik, tényleg van valamiféle varázslat működés közben :) Könnyebb varázslatnak nevezni, mint megpróbálni elmagyarázni, hogy mindez hogyan kapcsolódik egymáshoz. :) A második érv a Spring tanulmányozása mellett az, hogy a junior fejlesztők számára meghirdetett állások hozzávetőlegesen 90%-a (személyes megfigyeléseim alapján) vagy ismeretet igényel, vagy legalább általános elképzelést arról, hogy mi a tavasz.Data
, Web MVC
, és Security
modulok kifinomult fejlesztőket kínálnak :) De a mai nap csak az alapokról szól.
DI/IoC
Ha valaha is próbált olvasni a tavaszról, akkor az első dolog, amivel találkozott, valószínűleg a következő rövidítésekkel találkozott: DI/IoC. Most nagyon ajánlom, hogy tartson egy kis szünetet ebben a cikkben, és olvassa el ezt a DZone cikket ! Az IoC a vezérlés inverzióját jelenti. Ezt már mellékesen megemlítettem, amikor azt írtam, hogy a könyvtár használata azt jelenti, hogy a kódban meg kell adnia, hogy melyik metódust melyik objektumon hívja meg, de a keretrendszer használata általában azt jelenti, hogy a keretrendszer a megfelelő időben hívja meg a kódot. Más szóval, ez utóbbi esetben már nem Ön kezeli a kód/program végrehajtásának folyamatát – a keretrendszer ezt elvégzi Ön helyett. Átadta a vezérlést a keretrendszernek (a vezérlés megfordítása). A DI a függőségi injekciót jelenti. A függőségi injektálásnál nem hoz létre macskaobjektumokat a fő módszerrel, majd adja át őket a metódusainak. Ehelyett a tavaszi keretrendszer létrehozza ezeket az Ön számára. Egyszerűen mond valami olyasmit, hogy "szeretnék itt egy macskát", és a keretrendszer átad egyet neked a módszeredben. Ezt a rövidítést a jövőbeni cikkekben fogjuk látni.Bab és kontextus
A tavasz egyik kulcsfogalma a bab. Valójában ez csak valamilyen osztály tárgya. Tegyük fel, hogy van egy programunk, amelyhez 3 objektum szükséges: egy macska, egy kutya és egy papagáj. És van egy csomó osztályunk egy csomó módszerrel. Néha macskára van szükségünk egy módszerhez, néha kutyára kell egy másik módszerhez, és néha a módszereinkhez kell egy macska és egy papagáj (például a macska etetésének módszere, ha-ha). Más módszerekhez mindhárom objektumra szükség van. Igen, először létrehozhatjuk ezt a három objektumot a fő metódusban, majd átadhatjuk az osztályainknak, majd ezeken az osztályokon belül a megfelelő metódusoknak... És így tovább az egész programon keresztül. De ha azt is feltételezzük, hogy időnként meg akarjuk változtatni metódusaink bemeneti paramétereinek listáját (pl. úgy döntünk, hogy átírunk valamit, vagy új funkciókat adunk hozzá), akkor jó néhány változtatást kell végrehajtanunk a kódon. És most képzeljük el, hogy nem 3, hanem 300 ilyen tárgyunk van. Az egyik alternatíva az, hogy az összes objektumunkat egy listába gyűjtjük (List<Object>
), adja át minden metódusnak, majd kapja meg a szükséges objektumot a metódusokon belül. De a program futása közben mi van akkor, ha egy objektum hozzáadódik ehhez a listához, vagy ami még rosszabb, mi van, ha egyet törölnek? Ez feltörhet minden olyan metódust, ahol indexet használunk az objektumok listából való lekéréséhez. A probléma elkerülése érdekében úgy döntünk, hogy objektumainkat nem listában, hanem térképen tároljuk, ahol a kulcs az objektum neve, az érték pedig maga az objektum. Ez lehetővé teszi, hogy lekérjük a szükséges objektumokat egyszerűen a nevük használatával, pl. get("parrot"), és válaszul megkapjuk a papagáj objektumot. Vagy a kulcs lehet az objektum osztálya, az érték pedig maga az objektum. Ebben az esetben ahelyett, hogy megadnánk az objektum nevét, hanem csak megadhatjuk az objektum osztályát, amire szükségünk van. Ez is kényelmes. Vagy akár írhatnánk valamilyen burkolót a térképhez, ahol egyes metódusok a nevük alapján kapnak objektumokat, mások pedig az osztályuk alapján. Amihez eljutottunk, azt analkalmazási kontextusban a tavaszi keretrendszerben. A kontextus babok (objektumok) gyűjteménye. Hozzáférünk egy kontextushoz, hogy megkapjuk a szükséges babot (objektumot) a neve, a típusa vagy más módon. Ezenkívül megkérhetjük magát a tavaszt, hogy keresse meg a saját kontextusában azt a babot, amelyre szükségünk van, és adja át a módszerünknek. Tegyük fel például, hogy van egy ilyen módszerünk:
public void doSomething(Cat cat) {
...
}
Amikor Spring elhívta ezt a metódust, kivette a macska objektumunkat a környezetéből, és átadta a metódusnak. De most úgy döntöttünk, hogy a macskán kívül a módszerünkhöz papagáj is kell. Tavasszal mi sem lehet könnyebb! Egyszerűen ezt írjuk:
public void doSomething(Cat cat, Parrot parrot) {
...
}
Most, amikor a tavasz meghívja a módszerünket, megérti, hogy át kell adni egy macskát és egy papagájt, ezért a kontextusához megy, megkapja ezt a két objektumot, és átadja őket a mi módszerünknek. Azzal, hogy az irányítást a Springre ruházzuk, átadjuk a felelősséget az objektumok létrehozásáért, és átadjuk azokat módszereinknek, amelyeket a Spring hívni fog. Ez felveti a kérdést: honnan tudja a tavasz, hogy mely tárgyakat (babokat) kell létrehozni?
Egy alkalmazás konfigurálásának módjai
Három fő módja van az alkalmazások konfigurálásának , vagyis a Springnek pontosan megmondható, hogy mely objektumokra van szükségünk:- XML konfigurációs fájlok
- Java alapú konfiguráció
- automatikus konfiguráció
- a legnagyobb prioritású módszer, amelyet előnyben kell részesíteni, az automatikus konfiguráció
- ha az automatikus konfiguráció nem használható az összes lehetséges bean helyes konfigurálására, használjon Java-alapú konfigurációt (amely magában foglalja az objektumok létrehozását Java kód használatával)
- és a legalacsonyabb prioritású módszer a régimódi módszer – XML konfigurációs fájlok használatával.
GO TO FULL VERSION