Ohjelmointi

Mikä on kevät? Komponenttipohjainen Java-kehitys

Kevät on kenties paras 2000-luvun vaihteessa syntyneistä komponenttipohjaisista puitteista. Se parantaa huomattavasti tapaa, jolla kehittäjät kirjoittavat ja toimittavat infrastruktuurikoodin Java-pohjaisiin sovelluksiin. Perustamisestaan ​​lähtien Spring on tunnustettu johtavaksi kehykseksi yrityksen Java-kehitykselle. End-to-end-sovelluskehyksenä Spring heijastaa joitain Java EE -ominaisuuksia, mutta se tarjoaa yhdistelmän ominaisuuksia ja ohjelmointikäytäntöjä, joita et löydä muualta.

Tässä artikkelissa esitellään Spring ja sen keskeinen ohjelmointifilosofia ja -menetelmät: Ohjauksen kääntäminen ja riippuvuusinjektio. Aloitat myös kevään merkinnöillä ja muutamalla käytännön koodausesimerkillä.

Riippuvuuden injektointi ja kontrollin kääntäminen

Kevään ydinajatus on, että sen sijaan, että hallitsisit itse objektisuhteita, siirrät ne kehykseen. Ohjauksen kääntäminen (IOC) on menetelmä, jota käytetään objektisuhteiden hallintaan. Riippuvuusinjektio on mekanismi IOC: n toteuttamiseksi. Koska nämä kaksi käsitettä liittyvät toisiinsa, mutta eroavat toisistaan, tarkastellaan niitä tarkemmin:

  • Kontrollin kääntäminen (IOC) tekee juuri sen, mitä nimensä sanoo: se kääntää perinteisen hallinnan hierarkian objektisuhteiden toteuttamiseksi. Sen sijaan, että luotettaisiin sovelluskoodiin määrittelemään kuinka objektit liittyvät toisiinsa, puitteet määrittelevät suhteet. Menetelmänä KOK tuo johdonmukaisuuden ja ennustettavuuden objektiyhteyksiin, mutta se vaatii sinua kehittäjänä luopumaan hienorakeisesta hallinnasta.
  • Riippuvuuden injektio (DI) on mekanismi, jossa kehys "lisää" riippuvuuksia sovellukseesi. Se on IOC: n käytännön toteutus. Riippuvuusinjektio riippuu polymorfismista siinä mielessä, että se sallii vertailutyypin toteutumisen muutoksen puitteissa olevien kokoonpanojen perusteella. Kehys ruiskuttaa muuttuvia viitteitä sen sijaan, että ne täytettäisiin manuaalisesti sovelluskoodissa.

JSR-330

Kuten paljon Java-maailmassa, tavallisista spesifikaatioista on osittain omaksunut luonnossa tapahtuvana innovaationa kevät, Spring. Tässä tapauksessa JSR-330 on Java-standardi. JSR-330-mallin mukava asia on, että voit käyttää sitä muualla ja näet sen olevan käytössä muualla, kevään ulkopuolella. Voit käyttää sitä ilman Springiä. Kevät tuo kuitenkin paljon enemmän pöydälle.

Esimerkki # 1: Kevään riippuvuusinjektio

Ohjauksen kääntäminen ja riippuvuusinjektio ymmärretään parhaiten käyttämällä niitä, joten aloitamme pikaohjelmointiesimerkillä.

Oletetaan, että mallinnat autoa. Jos mallinnat tavallisessa vanhassa Java-sovelluksessa, sinulla saattaa olla käyttöliittymän jäsen Auto luokka viitata Moottori käyttöliittymä, kuten luettelossa 1 on esitetty.

Listaus 1. Objektisuhteet tavallisessa vanhassa Javassa

 julkisen käyttöliittymän moottori () {...} julkisen luokan auto {yksityinen moottori; public Engine getEngine () {...} public void setEngine (moottorimoottori) {...}} 

Listaus 1 sisältää käyttöliittymän Moottori tyyppi ja luokka betonille Auto tyyppi, joka viittaa Moottori. (Huomaa, että todellisessa ohjelmointiskenaariossa nämä olisivat erillisissä tiedostoissa.) Nyt kun luot Auto esimerkiksi määrität assosiaation luettelossa 2 esitetyllä tavalla.

Luettelo 2. Auton luominen moottoriliitännällä

 // ... auto newCar = uusi auto (); Moottori sixCylEngine = uusi InlineSixCylinderEngine (); newCar.setEngine (sixCylEngine); // Tee tavaraa auton kanssa 

Huomaa, että luot Auto esine ensin. Sitten luot uuden objektin, joka täyttää Moottori käyttöliittymä ja määritä se manuaalisesti Auto esine. Näin objektiyhdistelmät toimivat tavallisessa vanhassa Javassa.

Luokkien ja esineiden mallintaminen keväällä

Katsotaan nyt samaa esimerkkiä keväällä. Tässä voit tehdä jotain sellaista, mikä näkyy luettelossa 3. Aloitat Auto luokka, mutta tässä tapauksessa lisäät siihen merkinnän: @Pistää.

Listaus 3. Esimerkki @Inject-merkinnän käytöstä keväällä

 julkisen luokan Car {@Inject private Engine -moottori; // ...} 

Käyttämällä @Pistää merkintä (tai @Autowired, jos haluat) käskee Springin etsimään kontekstia ja lisäämään objektin automaattisesti viitteeseen sääntöjoukon perusteella.

Seuraavaksi harkitse @Komponentti merkintä, näkyy luettelossa 4.

Listaus 4. @Component annotation

 @Component public class InlineSixCylinderEngine toteuttaa moottorin {// ...} 

Luokan merkitseminen @Komponentti kertoo Springille, että se on käytettävissä injektioiden suorittamiseen. Tässä tapauksessa InlineSixCylEngine injektoidaan, koska se on käytettävissä ja täyttää yhdistyksen liitäntävaatimukset. Keväällä tätä kutsutaan "automaattisella" injektiolla. (Katso lisätietoja keväästä alla @Autowired merkintä.)

Irrottaminen suunnitteluperiaatteena

Ohjauksen kääntäminen riippuvuusinjektiolla poistaa konkreettisen riippuvuuden lähteen koodistasi. Missään ohjelmassa ei ole kovakoodattua viittausta Moottori toteutus. Tämä on esimerkki irrotus ohjelmistosuunnittelun periaatteena. Sovelluskoodin irrottaminen toteutuksesta helpottaa koodin hallintaa ja ylläpitoa. Sovellus tietää vähemmän siitä, miten sen osat sopivat yhteen, mutta muutoksia on paljon helpompi tehdä missä tahansa sovelluksen elinkaaren vaiheessa.

@Autowired vs @Inject

@Autowired ja @Pistää tee sama asia. Kuitenkin, @Pistää on Java-standardimerkintä, kun taas @Autowired on ominaista keväälle. Molemmilla on sama tarkoitus kertoa DI-moottorille injektoida kenttä tai menetelmä vastaavalla esineellä. Voit käyttää kumpaakin keväällä.

Katsaus kevään kehykseen

Nyt kun olet nähnyt kevätkoodin, katsotaanpa yleiskatsaus kehyksestä ja sen komponenteista. Kuten näette, kehys koostuu neljästä päämoduulista, jotka on jaettu paketteihin. Kevät antaa sinulle kohtuullisen paljon joustavuutta käyttämiesi moduulien suhteen.

  • Ydinastia
    • Ydin
    • Papu
    • Asiayhteys
    • Ilmaisukieli
  • Kuvasuuntautunut ohjelmointi (AOP)
    • AOP
    • Aspektit
    • Instrumentointi
  • Tietojen käyttö ja integrointi
    • JDBC
    • JPA / ORM
    • JMS
    • Tapahtumat
  • Verkko
    • Web / REST
    • Servlet
    • Tukivarret

Sen sijaan, että kattaisimme kaiken täällä, aloitetaan kahdella yleisimmin käytetyllä Spring-ominaisuudella.

Uuden projektin käynnistäminen: Spring Boot

Käytämme Spring Bootia esimerkkiprojektin luomiseen, jota käytämme esittelemään Spring-ominaisuuksia. Spring Boot tekee uusien projektien aloittamisesta paljon helpompaa, kuten näet itse. Aloita katsomalla alla esitetty pääluokka. Spring Bootissa voimme ottaa pääluokan a main () ja valitse sitten suoritettava se erillisenä tai pakettina käyttöönottoa varten Tomcatin kaltaisessa säilössä.

Listalla 5 on pääluokan ääriviivat, jotka elävät standardin mukaan src / main / java / hei sijainti.

Listaus 5. Pääluokka Spring Bootilla

 hei paketti; tuo org.springframework.boot.SpringApplication; tuo org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }} 

Huomaa kaksi asiaa yllä olevasta koodista: Ensinnäkin, kaikki työ tiivistetään kehykseen. Pääluokka käynnistää sovelluksen, mutta se ei tiedä mitään sovelluksen toiminnasta tai toiminnallisuudesta. Toiseksi SpringApplication.run () tekee varsinaisen käynnistyksen ja sovelluksen Sovellus luokka itse. Jälleen sovelluksen tekemä työ ei näy tässä.

@SpringBootApplication huomautus kääri muutaman tavallisen merkinnän ja käskee Springin tarkastelemaan pakettia, jossa komponenttien pääluokka on olemassa. Edellisessä esimerkissämme auton ja moottorin kanssa tämä antaisi Springille mahdollisuuden löytää kaikki luokat, joihin on lisätty merkintöjä @Komponentti ja @Pistää. Itse prosessi, nimeltään komponenttien skannaus, on erittäin muokattavissa.

Voit rakentaa sovelluksen standardilla mvn puhdas asennus, ja voit suorittaa sen Spring Boot -tavoitteella (mvn spring-boot: aja). Ennen kuin teemme sen, katsotaanpa tämän sovelluksen pom.xml tiedosto.

Listaus 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 

Huomaa kaksi tärkeää ominaisuutta yllä olevassa koodissa:

  1. vanhempi elementti perustuu spring-boot-starter-parent projekti. Tämä pääprojekti määrittelee useita hyödyllisiä oletusarvoja, kuten JDK 1.8: n oletuskäännöstason. Suurimmaksi osaksi voit luottaa siihen, että se tietää mitä tekee. Voit esimerkiksi jättää pois versionumeron monista yleisimmistä riippuvuuksista ja KevätKenkäVanhempi asettaa versiot yhteensopiviksi. Kun palautat vanhemman versionumeron, riippuvuusversiot ja oletusasetukset myös muuttuvat.
  2. spring-boot-maven-plugin mahdollistaa suoritettavan JAR / WAR-pakkauksen ja paikallaan juosta (kautta mvn spring-boot: aja komento).

Kevätverkon lisääminen riippuvuudeksi

Tähän mennessä olemme pystyneet käyttämään kevätkenkä rajoittaa kuinka paljon työtä teemme sovelluksen saamiseksi käyttöön. Lisätään nyt riippuvuus ja katsotaan, kuinka nopeasti voimme saada jotain selaimesta.

Listaus 7. Spring Webin lisääminen projektiin

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

Merkintä

Kevät havaitsee automaattisesti tiedostot, jotka ovat muuttuneet, ja kääntyy vastaavasti. Voit vain suorittaa mvn spring-boot: aja nouto muutoksiin.

Nyt kun meillä on perusprojektin määritys, olemme valmiita kahteen esimerkkiin.

Esimerkki # 2: RESTful-päätepisteiden luominen Spring Webillä

Olemme käyttäneet spring-boot-starter-web tuoda mukaan useita riippuvuuksia, joista on hyötyä verkkosovellusten rakentamisessa. Seuraavaksi luomme reitin käsittelijän URL-polulle. Springin verkkotuki on osa Spring MVC (Model-View-Controller) -moduulia, mutta älä anna sen huolestuttaa sinua: Spring Web tarjoaa täyden ja tehokkaan tuen myös RESTful-päätepisteiden rakentamiseen.

Luokka, jonka tehtävänä on URL-pyyntöjen kenttä, tunnetaan nimellä ohjain, kuten luettelossa 8 on esitetty.

Listaus 8. Kevään MVC REST -ohjain

 hei paketti; tuo org.springframework.stereotype.Controller; tuo org.springframework.ui.Model; tuo org.springframework.web.bind.annotation.RequestMapping; tuo org.springframework.web.bind.annotation.RequestMethod; tuo org.springframework.web.bind.annotation.ResponseBody; tuo org.springframework.web.bind.annotation.RequestParam; @Controller public class GreetingController {@RequestMapping (value = "/ hi", method = RequestMethod.GET) public String hi (@RequestParam (name = "name", required = false, defaultValue = "JavaWorld") String name, Model model ) {return "Hei" + nimi; }} 

@Controller-merkintä

@Controller huomautus tunnistaa luokan ohjaimeksi. Ohjaimeksi merkitty luokka tunnistetaan myös automaattisesti komponenttiluokaksi, mikä tekee siitä ehdokkaan automaattiseen johdotukseen. Aina kun tätä ohjainta tarvitaan, se kytketään kehykseen. Tässä tapauksessa liitämme sen MVC-järjestelmään pyyntöjen käsittelemiseksi.

Ohjain on erikoistunut komponentti. Se tukee @RequestMapping ja @ResponseBody merkinnät, jotka näet Hei() menetelmä. Nämä merkinnät kertovat kehykselle, miten URL-pyynnöt kartoitetaan sovellukseen.

Tässä vaiheessa voit käyttää sovellusta mvn spring-boot: aja. Kun osut /Hei URL, saat vastauksen, kuten "Hei, JavaWorld".

Huomaa, kuinka Spring on ottanut käyttöön komponenttien automaattisen johdotuksen perusteet ja toimittanut koko verkkokehyksen. Kevään kanssa sinun ei tarvitse erikseen liittää mitään yhteen!

@Request-merkinnät

@RequestMapping voit määrittää käsittelijän URL-polulle. Vaihtoehtoihin kuuluu haluamasi HTTP-menetelmän määritteleminen, mitä olemme tehneet tässä tapauksessa. Lähtö RequestMethod pois päältä, ohjatta ohjelmaa käsittelemään kaikkia HTTP-menetelmätyyppejä.

@RequestParam argumenttimerkinnän avulla voimme kartoittaa pyynnön parametrit suoraan metodin allekirjoitukseen, mukaan lukien vaatia tiettyjä parametreja ja määrittää oletusarvot, kuten olemme tehneet täällä. Voimme jopa kartoittaa pyynnön rungon luokalle @RequestBody argumenttimerkintä.

REST ja JSON vastaus

Jos luot REST-päätepisteen ja haluat palauttaa JSON-menetelmän, voit merkitä menetelmän @ResponseBody. Sitten vastaus pakataan automaattisesti nimellä JSON. Tässä tapauksessa palautat objektin metodista.

MVC: n käyttö Spring Webin kanssa

Samoin kuin Struts, Spring Web -moduulia voidaan helposti käyttää todelliseen mallinäkymän ohjaimen asetukseen. Siinä tapauksessa palautat kartoituksen annetulla mallikielellä (kuten Thymeleaf), ja Spring ratkaisee kartoituksen, toimittaa sille välittämäsi mallin ja antaa vastauksen.

Esimerkki # 3: Kevät JDBC: n kanssa

Tehdään nyt jotain mielenkiintoisempaa pyyntöjen käsittelijämme kanssa: palautetaan joitain tietoja tietokannasta. Tässä esimerkissä käytämme H2-tietokantaa. Onneksi Spring Boot tukee muistissa olevaa H2 DB: tä heti pakkauksesta.