Programovanie

Čo je jar? Vývoj komponentov pre Javu

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:

  1. The rodič prvok sa spolieha na pruž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í a SpringBootParent nastaví verzie tak, aby boli kompatibilné. Keď zvýšite číslo verzie rodiča, verzie závislostí a predvolené hodnoty sa tiež zmenia.
  2. The spring-boot-maven-plugin umožňuje spustiteľné balenie JAR / WAR a je na mieste bežať (prostredníctvom mvn 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.

$config[zx-auto] not found$config[zx-overlay] not found