Jar je možno najlepším z komponentových rámcov, ktoré sa objavili na prelome 21. storočia. Výrazne vylepšuje spôsob, akým vývojári píšu a doručujú kód infraštruktúry v aplikáciách založených na prostredí Java. Od svojho vzniku bol Spring uznávaný ako popredný rámec pre vývoj podnikových Java. Ako end-to-end aplikačný rámec Spring odráža niektoré schopnosti Java EE, ale ponúka kombináciu funkcií a programovacích konvencií, ktoré inde nenájdete.
Tento článok predstavuje jar a jej základnú filozofiu a metodológiu programovania: Inverzia riadenia a vkladanie závislostí. Začnete tiež jarnými anotáciami a niekoľkými praktickými príkladmi kódovania.
Vkladanie závislostí a inverzia riadenia
Základná myšlienka spoločnosti Spring je, že namiesto toho, aby ste svoje vzťahy s objektmi spravovali sami, vyložíte ich do rámca. Inverzia kontroly (IOC) je metodika používaná na správu vzťahov medzi objektmi. Vkladanie závislostí je mechanizmus na implementáciu MOV. Pretože tieto dva pojmy spolu súvisia, ale líšia sa, zvážme ich bližšie:
- Inverzia kontroly (IOC) robí to, čo hovorí jej názov: invertuje tradičnú hierarchiu kontroly plnenia objektových vzťahov. Namiesto spoliehania sa na aplikačný kód pri definovaní vzájomného vzťahu objektov sú rámcom definované vzťahy. Ako metodika zavádza MOV konzistentnosť a predvídateľnosť objektových vzťahov, vyžaduje však, aby ste sa ako vývojár vzdali určitej jemnozrnnej kontroly.
- Injekcia závislostí (DI) je mechanizmus, pomocou ktorého rámec „vnáša“ do vašej aplikácie závislosti. Je to praktická implementácia MOV. Vkladanie závislostí závisí od polymorfizmu v tom zmysle, že umožňuje zmenu splnenia referenčného typu na základe konfigurácií v rámci. Rámec vkladá odkazy na premenné skôr, ako by ich mal manuálne plniť v kóde aplikácie.
JSR-330
Rovnako ako vo svete Java, aj to, čo začalo ako divoká inovácia, Spring, bolo čiastočne absorbované štandardnými špecifikáciami. V tomto prípade je JSR-330 štandard Java. Príjemné na špecifikácii JSR-330 je, že ju môžete použiť inde a uvidíte ju aj inde ako na jar. Môžete ho použiť bez použitia pružiny. Jar však prináša na stôl oveľa viac.
Príklad č. 1: Injekcia jarnej závislosti
Inverziu riadenia a vkladanie závislostí najlepšie pochopíme ich použitím, preto začneme príkladom rýchleho programovania.
Povedzme, že modelujete auto. Ak modelujete v obyčajnej starej Jave, môžete mať v rozhraní člena rozhraní Auto
trieda odkazovať na Motor
ako je uvedené v zozname 1.
Zoznam 1. Vzťahy objektov v starej obyčajnej Jave
public Interface Engine () {...} public class Car {private Engine engine; public Engine getEngine () {...} public void setEngine (motor motora) {...}}
Záznam 1 obsahuje rozhranie pre server Motor
typu a triedy pre betón Auto
typu, ktorý odkazuje na Motor
. (Upozorňujeme, že v scenári skutočného programovania by to boli súbory v samostatných súboroch.) Teraz, keď vytvárate a Auto
inštanciu by ste nastavili ako je uvedené v zozname 2.
Zoznam 2. Vytvorenie automobilu pomocou rozhrania motora
// ... Car newCar = new Car (); Motor sixCylEngine = nový InlineSixCylinderEngine (); newCar.setEngine (sixCylEngine); // Robte veci s autom
Upozorňujeme, že ste vytvorili Auto
najskôr objekt. Potom vytvoríte nový objekt, ktorý spĺňa Motor
rozhranie a manuálne ho priradiť k Auto
objekt. Takto fungujú asociácie objektov v starej obyčajnej Jave.
Modelovanie tried a objektov na jar
Pozrime sa teraz na ten istý príklad na jar. Tu by ste mohli urobiť niečo podobné ako je uvedené v zozname 3. Začínate s Auto
triedy, ale v takom prípade k nej pridáte anotáciu: @Inject
.
Výpis 3. Príklad použitia anotácie @Inject na jar
auto verejnej triedy {@Inject private Engine engine; // ...}
Pomocou @Inject
anotácia (alebo @Autowired
, ak chcete) povie Springovi, aby prehľadal kontext a automaticky vložil objekt do referencie na základe súboru pravidiel.
Ďalej zvážte @ Komponent
anotácia uvedená v zozname 4.
Zoznam 4. Anotácia @Component
@ Verejná trieda komponentov InlineSixCylinderEngine implementuje engine {// ...}
Anotácia triedy s @ Komponent
povie Springovi, že je k dispozícii na plnenie injekcií. V takom prípade InlineSixCylEngine
bude vložený, pretože je k dispozícii a spĺňa požiadavky asociácie na rozhranie. Na jar sa to nazýva injekcia s automatickým pripojením. (Viac informácií o jarnom období nájdete nižšie @Autowired
anotácia.)
Oddelenie ako princíp návrhu
Inverzia kontroly s vložením závislosti odstráni z vášho zdroja zdroj konkrétnej závislosti. Nikde v programe nie je pevne zakomponovaný odkaz na Motor
implementácia. Toto je príklad oddelenie ako princíp návrhu softvéru. Oddelenie kódu aplikácie od implementácie uľahčuje správu a údržbu vášho kódu. Aplikácia vie menej o tom, ako jej časti do seba zapadajú, ale je oveľa jednoduchšie vykonávať zmeny kedykoľvek v životnom cykle aplikácie.
@Autowired vs @Inject
@Autowired
a @Inject
urob to isté. Avšak @Inject
je štandardná anotácia Java, zatiaľ čo @Autowired
je špecifický pre jar. Obe slúžia na rovnaký účel, keď povedali DI motoru, aby vstreklo pole alebo metódu zodpovedajúcemu objektu. Na jar môžete použiť ktorýkoľvek z nich.
Prehľad jarného rámca
Teraz, keď ste videli nejaký jarný kód, urobme si prehľad o rámci a jeho komponentoch. Ako vidíte, rámec sa skladá zo štyroch hlavných modulov, ktoré sú rozdelené do balíkov. Jar vám poskytuje dostatočnú flexibilitu s modulmi, ktoré použijete.
- Jadrový kontajner
- Jadro
- Bean
- Kontext
- Výrazový jazyk
- Aspektovo orientované programovanie (AOP)
- AOP
- Aspekty
- Prístrojové vybavenie
- Prístup k údajom a integrácia
- JDBC
- JPA / ORM
- JMS
- Transakcie
- Web
- Web / REST
- Servlet
- Vzpery
Namiesto toho, aby sme tu všetko rozoberali, začnime s dvoma z najčastejšie používaných jarných funkcií.
Spustenie nového projektu: Spring Boot
Pomocou Spring Boot vytvoríme ukážkový projekt, ktorý použijeme na ukážku funkcií Spring. Program Spring Boot výrazne uľahčuje začatie nových projektov, ako sami uvidíte. Na začiatok sa pozrite na hlavnú triedu uvedenú nižšie. V Spring Boot si môžeme vziať hlavnú triedu s a hlavný()
a potom sa rozhodnite, či ho chcete spustiť samostatne, alebo zabaliť na nasadenie v kontajneri, ako je Tomcat.
Zoznam 5 má obrysy našej hlavnej triedy, ktorá bude žiť podľa štandardu src / main / java / ahoj
umiestnenie.
Zoznam 5. Hlavná trieda s Spring Boot
balíček ahoj; importovať org.springframework.boot.SpringApplication; importovať org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication verejná trieda Aplikácia {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}
Poznamenajte si dve veci týkajúce sa vyššie uvedeného kódu: Najskôr je celá práca abstrahovaná do rámca. Hlavná trieda zavádza aplikáciu, ale nevie nič o tom, ako aplikácia funguje, alebo poskytuje jej funkčnosť. Po druhé, SpringApplication.run ()
vykonáva samotnú prácu pri zavádzaní aplikácie a odovzdávaní súborov Aplikácia
samotná trieda. Tu opäť nie je zjavná práca, ktorú aplikácia robí.
The @SpringBootApplication
anotácia obsahuje niekoľko štandardných anotácií a informuje Spring, aby sa pozrela na balík, kde existuje hlavná trieda pre komponenty. V našom predchádzajúcom príklade by to automobilu a motoru umožnilo spoločnosti Spring nájsť všetky triedy s poznámkami @ Komponent
a @Inject
. Samotný proces, tzv skenovanie komponentov, je vysoko prispôsobiteľný.
Aplikáciu môžete vytvoriť pomocou štandardu mvn čistá inštalácia
, a môžete ho spustiť s cieľom Spring Boot (mvn spring-boot: spustiť
). Predtým, ako to urobíme, sa pozrime na túto aplikáciu pom.xml
spis.
Výpis 6. Štartér pom.xml
com.javaworld what-is-spring 1.0.0 org.springframework.boot spring-boot-starter-parent 2.1.3.RELEASE 1.8 org.springframework.boot spring-boot-maven-plugin
Vo vyššie uvedenom kóde si všimnite dve dôležité funkcie:
- The
rodič
prvok sa spolieha napružina-štartér-štartér-rodič
projekt. Tento nadradený projekt definuje množstvo užitočných predvolených nastavení, napríklad predvolenú úroveň kompilátora JDK 1.8. Väčšinou sa môžete len spoľahnúť, že vie, čo robí. Ako príklad môžete vynechať číslo verzie pre mnoho bežných závislostí aSpringBootParent
nastaví verzie tak, aby boli kompatibilné. Keď zvýšite číslo verzie rodiča, verzie závislostí a predvolené hodnoty sa tiež zmenia. - The
spring-boot-maven-plugin
umožňuje spustiteľné balenie JAR / WAR a je na miestebežať
(prostredníctvommvn spring-boot: spustiť
príkaz).
Pridanie Spring Web ako závislosti
Zatiaľ sme to dokázali využiť pružinová topánka
aby sme obmedzili to, koľko práce venujeme uvedeniu a spusteniu aplikácie do života. Teraz pridajme závislosť a uvidíme, ako rýchlo môžeme v prehliadači niečo získať.
Zoznam 7. Pridanie Spring Web do projektu
org.springframework.boot spring-boot-starter-web
Poznámka
Jar automaticky zistí, ktoré súbory sa zmenili, a podľa toho ich zostaví. Môžete len vykonať mvn spring-boot: spustiť
na vyzdvihnutie zmien.
Teraz, keď máme základné nastavenie projektu, sme pripravení na naše dva príklady.
Príklad č. 2: Vytváranie RESTful koncových bodov pomocou Spring Web
Použili sme spring-boot-starter-web
priniesť niekoľko závislostí, ktoré sú užitočné pre tvorbu webových aplikácií. Ďalej vytvoríme obslužný program trasy pre cestu URL. Webová podpora spoločnosti Spring je súčasťou modulu Spring MVC (Model-View-Controller), ale nenechajte sa tým znepokojiť: Spring Web má tiež úplnú a efektívnu podporu pre vytváranie koncových bodov RESTful.
Trieda, ktorej úlohou je dopytovať adresy URL, je známa ako kontrolór, ako je uvedené v zozname 8.
Výpis 8. Pružinový radič REST MVC
balíček ahoj; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; importovať org.springframework.web.bind.annotation.RequestMapping; importovať org.springframework.web.bind.annotation.RequestMethod; importovať org.springframework.web.bind.annotation.ResponseBody; importovať org.springframework.web.bind.annotation.RequestParam; @Controller verejná trieda GreetingController {@RequestMapping (value = "/ hi", method = RequestMethod.GET) public String hi (@RequestParam (name = "name", required = false, defaultValue = "JavaWorld") Názov reťazca, model modelu ) {návrat "Hello" + meno; }}
Anotácia @Controller
The @ Kontrolór
anotácia identifikuje triedu ako kontrolór. Trieda označená ako radič je tiež automaticky identifikovaná ako trieda komponentov, čo z nej robí kandidáta na automatické zapojenie. Tento radič bude všade, kde je to potrebné, zapojený do rámca. V takom prípade ho zapojíme do systému MVC, aby sme vybavili žiadosti.
Ovládač je špecializovaný druh komponentu. Podporuje @RequestMapping
a @ResponseBody
anotácie, ktoré vidíte na Ahoj()
metóda. Tieto anotácie hovoria rámcu, ako mapovať požiadavky URL na aplikáciu.
V tomto okamihu môžete aplikáciu spustiť s mvn spring-boot: spustiť
. Keď narazíte na /Ahoj
URL, dostanete odpoveď ako „Dobrý deň, JavaWorld“.
Všimnite si, ako Spring prevzal základy komponentov automatického zapojenia a priniesol celý webový rámec. S jarou nemusíte nič výslovne spájať!
Anotácie @Request
The @RequestMapping
umožňuje definovať obslužný program pre cestu URL. Možnosti zahŕňajú definovanie požadovanej metódy HTTP, čo sme v tomto prípade urobili. Opúšťať RequestMethod
off dá programu pokyn na spracovanie všetkých typov metód HTTP.
The @RequestParam
anotácia argumentu nám umožňuje mapovať parametre požiadavky priamo do podpisu metódy, vrátane vyžadovania určitých parametrov a definovania predvolených hodnôt, ako sme to urobili tu. Môžeme dokonca namapovať telo žiadosti na triedu s @RequestBody
anotácia argumentu.
Odozva REST a JSON
Ak vytvárate koncový bod REST a chcete z metódy vrátiť JSON, môžete metódu anotovať @ResponseBody
. Odpoveď sa potom automaticky zabalí ako JSON. V takom prípade vrátite objekt z metódy.
Používanie MVC s Spring Web
Podobne ako v prípade Struts, modul Spring Web je možné ľahko použiť na skutočné nastavenie modelu a pohľadu na radič. V takom prípade by ste vrátili mapovanie v danom templatingovom jazyku (napríklad Thymeleaf) a Spring by mapovanie vyriešil, poskytol vám model, ktorý mu odovzdáte, a vygeneroval odpoveď.
Príklad č. 3: Jar s JDBC
Teraz urobíme niečo zaujímavejšie s našim obslužným programom požiadaviek: vráťme niektoré údaje z databázy. Na účely tohto príkladu použijeme databázu H2. Našťastie Spring Boot podporuje H2 DB v pamäti už po vybalení z krabice.