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:
- The
rodič
prvek spoléhá najaro-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 aSpringBootParent
nastaví kompatibilní verze. Když narazíte na číslo verze rodiče, verze závislostí a výchozí hodnoty se také změní. - The
spring-boot-maven-plugin
umožňuje spustitelné balení JAR / WAR a na místěběh
(přesmvn 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.