Pomlad je morda najboljši okvir na osnovi komponent, ki se je pojavil na prelomu v 21. stoletje. Izredno izboljšuje način, kako razvijalci pišejo in dostavljajo infrastrukturno kodo v aplikacijah, ki temeljijo na Javi. Od svoje ustanovitve je Spring prepoznan kot vodilni okvir za razvoj Java v podjetju. Kot celovit aplikacijski okvir Spring spominja na nekatere zmožnosti Java EE, vendar ponuja kombinacijo funkcij in programskih pravil, ki jih drugje ne boste našli.
Ta članek predstavlja Spring in njegovo osnovno filozofijo in metodologijo programiranja: Inverzija nadzora in vbrizgavanje odvisnosti. Začeli boste tudi z opombami Spring in nekaj praktičnimi primeri kodiranja.
Vbrizgavanje odvisnosti in inverzija nadzora
Glavna ideja Spring je, da namesto da sami upravljate razmerja med objekti, jih raztovorite v ogrodje. Inverzija nadzora (IOC) je metodologija, ki se uporablja za upravljanje odnosov objektov. Injekcija odvisnosti je mehanizem za izvajanje MOK. Ker sta ta dva koncepta povezana, vendar različna, si jih oglejmo natančneje:
- Inverzija nadzora (IOC) počne točno to, kar pove že njegovo ime: obrne tradicionalno hierarhijo nadzora za izpolnjevanje objektnih razmerij. Namesto da se zanašamo na aplikacijsko kodo, da določimo, kako se predmeti povezujejo med seboj, odnosi definira ogrodje. IOC kot metodologijo uvaja doslednost in predvidljivost odnosov z objekti, vendar se od vas kot razvijalca odpovedate drobnemu nadzoru.
- Injekcija odvisnosti (DI) je mehanizem, pri katerem ogrodje "vbrizga" odvisnosti v vašo aplikacijo. To je praktično izvajanje MOK. Vbrizgavanje odvisnosti je odvisno od polimorfizma, v smislu, da omogoča spreminjanje izpolnitve referenčnega tipa glede na konfiguracije v okviru. Okvir vbrizga referenčne spremenljivke, namesto da bi jih ročno izpolnjevali v aplikacijski kodi.
JSR-330
Tako kot v svetu Jave je tisto, kar se je začelo kot divja inovacija Spring, delno prevzela standardna specifikacija. V tem primeru je JSR-330 standard Java. Lepo pri specifikaciji JSR-330 je, da jo lahko uporabljate drugje in jo boste videli drugje, izven pomladi. Uporabite ga lahko brez uporabe Spring. Vendar Pomlad na mizo prinese še veliko več.
Primer # 1: Vbrizgavanje odvisnosti od vzmeti
Inverzijo nadzora in vbrizgavanje odvisnosti je najbolje razumeti z njihovo uporabo, zato bomo začeli s primerom hitrega programiranja.
Recimo, da modelirate avto. Če modelirate v navadni stari Javi, boste morda imeli člana vmesnika na Avto
razred za sklicevanje na Motor
vmesnik, kot je prikazano v seznamu 1.
Seznam 1. Predmetni odnosi v navadni stari Javi
javni vmesnik Engine () {...} avtomobil javnega razreda {motor motorja private; public Engine getEngine () {...} public void setEngine (Engine engine) {...}}
Seznam 1 vsebuje vmesnik za Motor
vrsto in razred za beton Avto
, ki se sklicuje na Motor
. (Upoštevajte, da bi bili v resničnem programskem scenariju v ločenih datotekah.) Ko ustvarjate datoteko Avto
Na primer, povezavo bi nastavili, kot je prikazano v seznamu 2.
Seznam 2. Ustvarjanje avtomobila z vmesnikom Engine
// ... Car newCar = new Car (); Motor sixCylEngine = nov InlineSixCylinderEngine (); newCar.setEngine (sixCylEngine); // Naredite stvari z avtom
Upoštevajte, da ustvarite Avto
najprej objekt. Nato ustvarite nov objekt, ki izpolnjuje Motor
in ga ročno dodelite Avto
predmet. Tako delujejo asociacije predmetov v navadni stari Javi.
Modeliranje razredov in predmetov spomladi
Zdaj pa si oglejmo isti primer spomladi. Tu lahko naredite nekaj takega, kot je prikazano v seznamu 3. Začnete z Avto
razred, vendar mu v tem primeru dodate pripis: @Inject
.
Seznam 3. Primer uporabe opombe @Inject spomladi
javni razred avtomobila {@Inject motor zasebnega motorja; // ...}
Uporabljati @Inject
pripis (oz @Autowired
, če želite) pove Spring, naj po kontekstu poišče kontekst in samodejno vbrizga predmet v sklic na podlagi nabora pravil.
Nato razmislite o @Component
pripis, prikazan v seznamu 4.
Seznam 4. Pripis @Component
@Component javni razred InlineSixCylinderEngine implementira Engine {// ...}
Označevanje predavanja z @Component
pove Spring, da je na voljo za izpolnjevanje injekcij. V tem primeru je InlineSixCylEngine
bi se vbrizgal, ker je na voljo in izpolnjuje zahteve vmesnika združenja. Spomladi se temu reče "samodejno ožičeno" vbrizgavanje. (Glej spodaj za več o Spring's @Autowired
pripis.)
Ločevanje kot načelo oblikovanja
Inverzija nadzora z vbrizgavanjem odvisnosti odstrani vir konkretne odvisnosti iz vaše kode. Nikjer v programu ni trdno kodirane reference Motor
izvajanje. To je primer ločevanje kot načelo oblikovanja programske opreme. Ločevanje kode aplikacije od izvedbe olajša upravljanje in vzdrževanje kode. Aplikacija manj ve, kako se njeni deli prilegajo, vendar je veliko lažje spreminjati kadar koli v življenjskem ciklu aplikacije.
@Autowired vs @Inject
@Autowired
in @Inject
naredi isto. Vendar @Inject
je standardni pripis Java, medtem ko @Autowired
je značilno za pomlad. Oba služita istemu namenu, da DI motorju pove, naj vbrizga polje ali metodo z ustreznim predmetom. Spomladi jih lahko uporabite.
Pregled pomladnega okvira
Zdaj, ko ste videli nekaj pomladne kode, si oglejmo pregled ogrodja in njegovih komponent. Kot lahko vidite, je ogrodje sestavljeno iz štirih glavnih modulov, ki so razdeljeni na pakete. Pomlad vam omogoča precej prilagodljivosti z moduli, ki jih boste uporabljali.
- Jedro posode
- Jedro
- Fižol
- Kontekst
- Jezik izražanja
- Aspektno usmerjeno programiranje (AOP)
- AOP
- Vidiki
- Instrumentacija
- Dostop do podatkov in integracija
- JDBC
- JPA / ORM
- JMS
- Transakcije
- Splet
- Splet / POČITEK
- Servlet
- Podporniki
Namesto da bi tukaj vse zajeli, začnimo z dvema najpogosteje uporabljenima pomladnima funkcijama.
Zagon novega projekta: Spring Boot
S pomočjo Spring Boot bomo ustvarili primer projekta, ki ga bomo uporabili za predstavitev Spring funkcij. Kot boste videli sami, Spring Boot olajša zagon novih projektov. Za začetek si oglejte glavni razred, prikazan spodaj. V Spring Boot lahko vzamemo glavni razred z a glavni ()
in nato izberite, da ga zaženete samostojno ali pa paket za razmestitev v vsebniku, kot je Tomcat.
Seznam 5 ima obrise našega glavnega razreda, ki bo živel po standardu src / main / java / hello
lokacijo.
Seznam 5. Glavni razred s Spring Boot
paket pozdrav; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication javni razred Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}
Upoštevajte dve stvari glede zgornje kode: Najprej je vse delo povzeto v ogrodje. Glavni razred zažene aplikacijo, vendar ne ve ničesar o tem, kako aplikacija deluje ali zagotavlja svojo funkcionalnost. Drugič, SpringApplication.run ()
dejansko opravi zagon aplikacije in prenos v Uporaba
razred sam. Ponovno delo, ki ga opravlja aplikacija, tukaj ni očitno.
The @SpringBootApplication
anotacija zaokroži nekaj standardnih opomb in pomladi sporoči, naj pogleda paket, kjer obstaja glavni razred komponent. V našem prejšnjem primeru bi z avtomobilom in motorjem Spring lahko našel vse razrede, označene s @Component
in @Inject
. Sam postopek, imenovan skeniranje komponent, je zelo prilagodljiv.
Aplikacijo lahko sestavite s standardom mvn čista namestitev
, in ga lahko zaženete s ciljem Spring Boot (mvn spring-boot: zaženi
). Pred tem poglejmo to aplikacijo pom.xml
mapa.
Seznam 6. Začetnik 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 zgornji kodi upoštevajte dve pomembni lastnosti:
- The
starš
element temelji naspring-boot-starter-starš
projekt. Ta nadrejeni projekt definira številne uporabne privzete vrednosti, na primer privzeto raven prevajalnika JDK 1.8. Večinoma lahko samo zaupate, da ve, kaj počne. Kot primer lahko izpustite številko različice za številne pogoste odvisnosti inSpringBootParent
bo določil združljivosti različic. Ko nataknete številko različice starša, se spremenijo tudi različice odvisnosti in privzete vrednosti. - The
spring-boot-maven-plugin
omogoča izvedljivo embalažo JAR / WAR in jo namestite na svoje mestoteči
(prekmvn spring-boot: zaženi
ukaz).
Dodajanje Spring Web-a kot odvisnosti
Do zdaj smo lahko uporabljali vzmetni čevelj
da omejimo, koliko dela bomo vložili za zagon in delovanje aplikacije. Zdaj pa dodajte odvisnost in poglejmo, kako hitro lahko nekaj dobimo v brskalniku.
Seznam 7. Dodajanje Spring Web-a projektu
org.springframework.boot spring-boot-starter-web
Opomba
Spring bo samodejno zaznal, katere datoteke so se spremenile, in jih ustrezno prevedel. Lahko samo izvršite mvn spring-boot: zaženi
do sprememb prevzema.
Zdaj, ko imamo osnovno nastavitev projekta, smo pripravljeni na naša dva primera.
2. primer: Izdelava RESTful končnih točk z Spring Web
Uporabili smo spring-boot-starter-web
prinesti več odvisnosti, ki so koristne za izdelavo spletnih aplikacij. Nato bomo ustvarili obdelovalec poti za pot URL-ja. Spletna podpora Spring je del modula Spring MVC (Model-View-Controller), vendar naj vas to ne skrbi: Spring Web ima tudi popolno in učinkovito podporo za gradnjo RESTful končnih točk.
Razred, katerega naloga je pošiljanje zahtev za URL, je znan kot krmilnik, kot je prikazano na seznamu 8.
Seznam 8. Pomladni krmilnik MVC REST
paket pozdrav; uvoz org.springframework.stereotype.Controller; uvoz org.springframework.ui.Model; uvoz org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; uvoz org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RequestParam; Javni razred @Controller GreetingController {@RequestMapping (value = "/ hi", method = RequestMethod.GET) javni niz hi (@RequestParam (name = "name", required = false, defaultValue = "JavaWorld") Ime niza, model modela ) {vrni "Pozdravljeni" + ime; }}
Pripis @Controller
The @Controller
pripis označuje razred kot krmilnik. Razred, označen kot krmilnik, se samodejno prepozna tudi kot razred komponent, zaradi česar je kandidat za samodejno ožičenje. Kjer koli je ta krmilnik potreben, bo priključen na ogrodje. V tem primeru ga bomo vključili v sistem MVC za obdelavo zahtev.
Krmilnik je posebna vrsta komponent. Podpira @RequestMapping
in @ResponseBody
pripombe, ki jih vidite na živjo ()
metoda. Ti pripisi prikazujejo ogrodju, kako preslikati zahteve za URL v aplikacijo.
Na tej točki lahko aplikacijo zaženete z mvn spring-boot: zaženi
. Ko pritisnete / živjo
URL, boste dobili odgovor, kot je "Pozdravljeni, JavaWorld."
Opazite, kako je Spring sprejel osnove samodejnega ožičenja komponent in ustvaril celoten spletni okvir. S pomladjo vam ni treba izrecno ničesar povezovati!
Pripisi @Request
The @RequestMapping
vam omogoča, da določite vodnik za pot URL-ja. Možnosti vključujejo določitev želene metode HTTP, kar smo v tem primeru storili. Odhod RequestMethod
off bi programu naročil, naj obravnava vse vrste metod HTTP.
The @RequestParam
pripis argumenta nam omogoča preslikavo parametrov zahteve neposredno v podpis metode, vključno z zahtevami za določene parametre in definiranjem privzetih vrednosti, kot smo to storili tukaj. Telo zahteve lahko celo preslikamo v razred z @RequestBody
pripis argumenta.
Odziv REST in JSON
Če ustvarjate končno točko REST in želite vrniti JSON iz metode, jo lahko označite z @ResponseBody
. Odziv bo nato samodejno zapakiran v obliki JSON. V tem primeru boste vrnili predmet iz metode.
Uporaba MVC s Spring Web
Podobno kot Struts tudi modul Spring Web lahko enostavno uporabite za resnično nastavitev krmilnika model-view-view. V tem primeru bi vrnili preslikavo v danem predloškem jeziku (na primer Thymeleaf), Spring pa bi razrešil preslikavo, zagotovil model, ki mu ga posredujete, in upodobil odgovor.
3. primer: Pomlad z JDBC
Zdaj pa naredimo nekaj bolj zanimivega z našim upravljalcem zahtev: vrnimo nekaj podatkov iz baze podatkov. Za namen tega primera bomo uporabili bazo podatkov H2. Na srečo Spring Boot podpira vgrajeno pomnilniško bazo podatkov H2.