Programování

Co je jaro? Vývoj komponent pro Javu

Jaro je možná nejlepší z komponentních rámců, které se objevily na přelomu 21. století. Výrazně vylepšuje způsob, jakým vývojáři píší a doručují kód infrastruktury v aplikacích založených na prostředí Java. Od svého vzniku byl Spring uznáván jako přední rámec pro vývoj podnikových prostředí Java. Jako end-to-end aplikační framework Spring zrcadlí některé funkce Java EE, ale nabízí kombinaci funkcí a programovacích konvencí, které jinde nenajdete.

Tento článek představuje jaro a jeho základní filozofii a metodiku programování: Inverze řízení a vkládání závislostí. Začnete také s jarními anotacemi a několika praktickými příklady kódování.

Závislost injekce a inverze řízení

Jarní základní myšlenkou je, že místo toho, abyste sami spravovali vztahy s objekty, vyložíte je do rámce. Inverze řízení (IOC) je metodika používaná ke správě vztahů s objekty. Vkládání závislostí je mechanismus pro implementaci IOC. Protože tyto dva pojmy spolu souvisejí, ale liší se, pojďme je blíže zvážit:

  • Inverze kontroly (IOC) dělá přesně to, co jeho název říká: převrací tradiční hierarchii řízení pro plnění vztahů s objekty. Namísto spoléhání se na kód aplikace k definování vzájemného vztahu objektů jsou vztahy definovány rozhraním. Jako metodika IOC zavádí konzistenci a předvídatelnost vztahů s objekty, ale vyžaduje to, abyste se jako vývojář vzdali nějaké jemnozrnné kontroly.
  • Závislost injekce (DI) je mechanismus, kde rámec „vkládá“ do vaší aplikace závislosti. Jedná se o praktickou implementaci IOC. Vkládání závislostí závisí na polymorfismu v tom smyslu, že umožňuje změnu splnění referenčního typu na základě konfigurací v rámci. Rámec vkládá odkazy na proměnné, místo aby je měl ručně plnit v kódu aplikace.

JSR-330

Stejně jako ve světě Java, i to, co začalo jako divoká inovace, Spring, bylo částečně absorbováno standardní specifikací. V tomto případě je JSR-330 standard Java. Pěkná věc na specifikaci JSR-330 je, že ji můžete použít jinde a uvidíte ji i jinde, mimo jaro. Můžete jej použít bez použití Spring. Jaro však přináší na stůl mnohem víc.

Příklad č. 1: Vkládání závislostí na jaře

Inverzi řízení a vkládání závislostí nejlépe pochopíme pomocí jejich použití, takže začneme příkladem rychlého programování.

Řekněme, že modelujete auto. Pokud modelujete ve staré jednoduché Javě, můžete mít na rozhraní člena rozhraní Auto třída pro odkaz na Motor rozhraní, jak je uvedeno v seznamu 1.

Výpis 1. Vztahy objektů v jednoduché staré Javě

 public Interface Engine () {...} public class Car {private Engine engine; public Engine getEngine () {...} public void setEngine (engine Engine) {...}} 

Výpis 1 obsahuje rozhraní pro Motor typ a třída pro beton Auto typ, který odkazuje na Motor. (Všimněte si, že ve scénáři skutečného programování by to byly samostatné soubory.) Nyní, když vytváříte a Auto Například byste nastavili přidružení, jak je uvedeno v seznamu 2.

Výpis 2. Vytvoření automobilu pomocí rozhraní motoru

 // ... Car newCar = new Car (); Engine sixCylEngine = nový InlineSixCylinderEngine (); newCar.setEngine (sixCylEngine); // Dělejte věci s autem 

Všimněte si, že vytvoříte Auto nejprve objekt. Poté vytvoříte nový objekt, který splňuje Motor rozhraní a přiřadit jej ručně Auto objekt. Tak fungují asociace objektů ve staré staré Javě.

Modelování tříd a objektů na jaře

Podívejme se nyní na stejný příklad na jaře. Zde můžete udělat něco jako to, co je zobrazeno v Seznamu 3. Začnete s Auto třídy, ale v tomto případě k ní přidáte anotaci: @Inject.

Výpis 3. Příklad použití anotace @Inject na jaře

 public class Car {@Inject private Engine engine; // ...} 

Za použití @Inject anotace (nebo @Autowired, pokud chcete) řekne Springovi, aby prohledal kontext a automaticky vložil objekt do reference na základě sady pravidel.

Dále zvažte @Součástka anotace, zobrazená v seznamu 4.

Výpis 4. Anotace @Component

 @Component public class InlineSixCylinderEngine implementuje Engine {// ...} 

Anotace třídy pomocí @Součástka říká Spring, že je k dispozici pro plnění injekcí. V tomto případě InlineSixCylEngine bude vložen, protože je k dispozici a splňuje požadavek na rozhraní přidružení. Na jaře se tomu říká „autowired“ injekce. (Další informace o Spring's naleznete níže @Autowired anotace.)

Oddělení jako konstrukční princip

Inverze ovládacího prvku s vložením závislosti odebere z vašeho zdroje zdroj konkrétní závislosti. Nikde v programu není napevno odkaz na Motor implementace. Toto je příklad oddělení jako princip softwarového designu. Oddělení kódu aplikace od implementace usnadňuje správu a údržbu vašeho kódu. Aplikace ví méně o tom, jak její části do sebe zapadají, ale je mnohem snazší provádět změny kdykoli v životním cyklu aplikace.

@Autowired vs @Inject

@Autowired a @Inject udělat totéž. Nicméně, @Inject je standardní poznámka Java, zatímco @Autowired je specifický pro jaro. Oba slouží ke stejnému účelu, když říkají motoru DI, aby injektoval pole nebo metodu s odpovídajícím objektem. Na jaře můžete použít kterýkoli z nich.

Přehled jarního rámce

Nyní, když jste viděli nějaký jarní kód, pojďme si přečíst rámec a jeho komponenty. Jak vidíte, rámec se skládá ze čtyř hlavních modulů, které jsou rozděleny do balíčků. Jaro vám dává dostatečnou flexibilitu s moduly, které použijete.

  • Základní nádoba
    • Jádro
    • Fazole
    • Kontext
    • Výrazový jazyk
  • Aspektově orientované programování (AOP)
    • AOP
    • Aspekty
    • Instrumentace
  • Přístup k datům a integrace
    • JDBC
    • JPA / ORM
    • JMS
    • Transakce
  • Web
    • Web / REST
    • Servlet
    • Vzpěry

Spíše než zde vše pokrýt, pojďme začít se dvěma běžněji používanými funkcemi Spring.

Spouštění nového projektu: Spring Boot

Pomocí Spring Boot vytvoříme ukázkový projekt, který použijeme k ukázce funkcí Spring. Spring Boot usnadňuje spouštění nových projektů, jak sami uvidíte. Nejprve se podívejte na hlavní třídu zobrazenou níže. V Spring Boot můžeme vzít hlavní třídu s a hlavní() metoda a poté se rozhodnete spustit samostatně nebo balíček pro nasazení v kontejneru, jako je Tomcat.

Výpis 5 má obrysy naší hlavní třídy, která bude žít podle standardu src / main / java / ahoj umístění.

Výpis 5. Hlavní třída s Spring Boot

 balíček ahoj; importovat org.springframework.boot.SpringApplication; importovat org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication veřejná třída Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }} 

U výše uvedeného kódu si povšimněte dvou věcí: Nejprve je celá práce abstrahována do rámce. Hlavní třída spouští aplikaci, ale neví nic o tom, jak aplikace funguje, nebo poskytuje její funkčnost. Zadruhé SpringApplication.run () dělá skutečnou práci při spouštění aplikace a při předávání aplikace třída sama. Opět zde není zřejmá práce, kterou aplikace dělá.

The @SpringBootApplication annotation shrnuje několik standardních anotací a říká Spring, aby se podíval na balíček, kde existuje hlavní třída pro komponenty. V našem předchozím příkladu by to automobilu a motoru umožnilo Springovi najít všechny třídy s poznámkami @Součástka a @Inject. Samotný proces, tzv skenování komponent, je vysoce přizpůsobitelný.

Aplikaci můžete vytvořit pomocí standardu mvn čistá instalace, a můžete jej spustit s cílem Spring Boot (mvn spring-boot: spustit). Než to uděláme, podívejme se na tuto aplikaci pom.xml soubor.

Výpis 6. Starter 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 

Všimněte si dvou důležitých funkcí ve výše uvedeném kódu:

  1. The rodič prvek spoléhá na jaro-boot-startér-rodič projekt. Tento nadřazený projekt definuje řadu užitečných výchozích hodnot, například výchozí úroveň kompilátoru JDK 1.8. Většinou můžete jen věřit, že ví, co dělá. Jako příklad můžete u mnoha běžných závislostí vynechat číslo verze a SpringBootParent nastaví kompatibilní verze. Když narazíte na číslo verze rodiče, verze závislostí a výchozí hodnoty se také změní.
  2. The spring-boot-maven-plugin umožňuje spustitelné balení JAR / WAR a na místě běh (přes mvn spring-boot: spustit příkaz).

Přidání Spring Web jako závislosti

Zatím jsme byli schopni použít pružinová bota abychom omezili, kolik práce vložíme do uvedení aplikace do provozu. Nyní přidejme závislost a podívejme se, jak rychle můžeme v prohlížeči něco získat.

Výpis 7. Přidání Spring Web do projektu

  org.springframework.boot spring-boot-starter-web 

Poznámka

Jaro automaticky detekuje, jaké soubory se změnily, a podle toho kompiluje. Můžete jen vykonat mvn spring-boot: spustit k vyzvednutí změn.

Nyní, když máme základní nastavení projektu, jsme připraveni na naše dva příklady.

Příklad č. 2: Vytváření RESTful koncových bodů pomocí Spring Web

Použili jsme jaro-boot-startovací web přinést několik závislostí, které jsou užitečné pro vytváření webových aplikací. Dále vytvoříme obslužnou rutinu trasy pro cestu URL. Jarní webová podpora je součástí modulu Spring MVC (Model-View-Controller), ale nedělejte si s tím starosti: Spring Web má plnou a efektivní podporu i pro vytváření koncových bodů RESTful.

Třída, jejíž úlohou je zadávat požadavky na adresy URL, se nazývá a ovladač, jak je uvedeno v seznamu 8.

Výpis 8. Pružinový řadič REST MVC

 balíček ahoj; import org.springframework.stereotype.Controller; importovat org.springframework.ui.Model; importovat org.springframework.web.bind.annotation.RequestMapping; importovat org.springframework.web.bind.annotation.RequestMethod; importovat org.springframework.web.bind.annotation.ResponseBody; importovat org.springframework.web.bind.annotation.RequestParam; @Controller veřejná třída GreetingController {@RequestMapping (value = "/ hi", method = RequestMethod.GET) public String hi (@RequestParam (name = "name", required = false, defaultValue = "JavaWorld") Název řetězce, model modelu ) {návrat "Hello" + jméno; }} 

Anotace @Controller

The @Ovladač anotace identifikuje třídu jako řadič. Třída označená jako řadič je také automaticky identifikována jako třída součásti, což z ní činí kandidáta na automatické zapojení. Kdekoli je tento řadič potřebný, bude zapojen do rámce. V takovém případě jej zapojíme do systému MVC, abychom mohli zpracovávat požadavky.

Řadič je specializovaný druh součásti. Podporuje @RequestMapping a @ResponseBody anotace, které vidíte na Ahoj() metoda. Tyto anotace říkají rámci, jak mapovat požadavky URL na aplikaci.

V tomto okamžiku můžete aplikaci spustit pomocí mvn spring-boot: spustit. Když narazíte na /Ahoj URL, dostanete odpověď jako „Ahoj, JavaWorld.“

Všimněte si, jak Spring převzal základy komponent automatického zapojení a dodal celý webový rámec. S Spring nemusíte nic výslovně spojovat!

Poznámky @Request

The @RequestMapping umožňuje definovat obslužnou rutinu pro cestu URL. Mezi možnosti patří definování požadované metody HTTP, což jsme v tomto případě udělali. Odchází RequestMethod off instruuje program, aby zpracoval všechny typy metod HTTP.

The @RequestParam anotace argumentů nám umožňuje mapovat parametry požadavku přímo do podpisu metody, včetně vyžadování určitých parametrů a definování výchozích hodnot, jak jsme to udělali zde. Můžeme dokonce mapovat tělo požadavku na třídu s @RequestBody anotace argumentu.

Odpověď REST a JSON

Pokud vytváříte koncový bod REST a chcete z metody vrátit JSON, můžete metodu anotovat pomocí @ResponseBody. Odpověď se poté automaticky zabalí jako JSON. V tomto případě vrátíte objekt z metody.

Používání MVC s Spring Web

Podobně jako Struts lze modul Spring Web snadno použít pro skutečné nastavení modelu a pohledu řadiče. V takovém případě byste vrátili mapování v daném templatingovém jazyce (jako Thymeleaf) a Spring by vyřešil mapování, poskytl model, který mu předáte, a vykreslil odpověď.

Příklad č. 3: Jaro s JDBC

Nyní pojďme udělat něco zajímavějšího s naší obsluhou požadavků: vraťme některá data z databáze. Pro účely tohoto příkladu použijeme databázi H2. Naštěstí Spring Boot podporuje H2 DB v paměti po vybalení z krabice.

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