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:
-
vanhempi
elementti perustuuspring-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 jaKevätKenkäVanhempi
asettaa versiot yhteensopiviksi. Kun palautat vanhemman versionumeron, riippuvuusversiot ja oletusasetukset myös muuttuvat. -
spring-boot-maven-plugin
mahdollistaa suoritettavan JAR / WAR-pakkauksen ja paikallaanjuosta
(kauttamvn 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.