Pavasaris yra bene geriausias iš komponentais pagrįstų rėmų, atsiradusių XXI amžiaus sandūroje. Tai žymiai pagerina tai, kaip kūrėjai rašo ir teikia infrastruktūros kodus Java pagrįstose programose. Nuo pat savo veiklos pradžios „Spring“ buvo pripažinta pagrindine įmonės „Java“ plėtros sistema. Kaip „end-to-end“ programos pagrindą „Spring“ atspindi kai kurias „Java EE“ galimybes, tačiau ji siūlo funkcijų ir programavimo būdų derinį, kurio nerasite kitur.
Šiame straipsnyje pristatoma pavasaris ir jo pagrindinė programavimo filosofija bei metodika: Valdymo inversija ir priklausomybės injekcija. Taip pat pradėsite nuo pavasario anotacijų ir kelių praktinių kodavimo pavyzdžių.
Priklausomybės įpurškimas ir valdymo inversija
Pagrindinė pavasario idėja yra ta, kad užuot patys tvarkę santykius su objektais, jūs juos perkraunate į sistemą. Valdymo inversija (IOC) yra metodika, naudojama valdant objektų ryšius. Priklausomybės injekcija yra TOK įgyvendinimo mechanizmas. Kadangi šios dvi sąvokos yra susijusios, bet skiriasi, panagrinėkime jas atidžiau:
- Valdymo inversija (IOC) daro tik tai, ką sako jos pavadinimas: apverčia tradicinę valdymo hierarchiją, kad būtų įvykdyti objektų santykiai. Užuot pasikliaudami programos kodu, norėdami apibrėžti, kaip objektai yra tarpusavyje susiję, santykius apibrėžia sistema. Kaip metodiką, TOK pateikia nuoseklumą ir nuspėjamumą objekto santykiams, tačiau reikalauja, kad jūs, kaip kūrėjas, atsisakytumėte smulkios kontrolės.
- Priklausomybės injekcija (DI) yra mechanizmas, kai sistema „įterpia“ priklausomybes į jūsų programą. Tai praktinis TOK įgyvendinimas. Priklausomybės įpurškimas priklauso nuo polimorfizmo ta prasme, kad jis leidžia pakeisti etaloninį tipą, atsižvelgiant į sistemos struktūras. Sistema įterpia kintamas nuorodas, o ne jas rankiniu būdu užpildo programos kode.
JSR-330
Kaip ir daugumoje „Java“ pasaulyje, tai, kas prasidėjo kaip laukinė naujovė „Spring“, iš dalies buvo įtraukta į standartines specifikacijas. Šiuo atveju JSR-330 yra „Java“ standartas. Gražus dalykas, susijęs su JSR-330 specifikacija, galite jį naudoti kitur ir pamatysite, kad jis bus naudojamas kitur, ne tik pavasarį. Galite jį naudoti nenaudodami „Spring“. Tačiau pavasaris pateikia daug daugiau stalo.
1 pavyzdys: Pavasario priklausomybės injekcija
Valdymo inversija ir priklausomybės injekcija geriausiai suprantama jas naudojant, todėl pradėsime nuo greito programavimo pavyzdžio.
Tarkime, jūs modeliuojate automobilį. Jei modeliuojate paprastoje senoje „Java“, galbūt turite sąsajos narį Automobilis
klasės nuoroda į Variklis
sąsaja, kaip parodyta 1 sąraše.
Sąrašas 1. Objektų santykiai paprastoje senoje „Java“
viešosios sąsajos variklis () {...} viešosios klasės automobilis {privataus variklio variklis; public engine getEngine () {...} public void setEngine (variklio variklis) {...}}
1 sąraše yra Variklis
tipas ir betono klasė Automobilis
tipas, nurodantis Variklis
. (Atkreipkite dėmesį, kad realiame programavimo scenarijuje jie būtų atskiruose failuose.) Dabar, kai kuriate Automobilis
pvz., nustatytumėte susiejimą, kaip parodyta 2 sąraše.
Sąrašas 2. Automobilio su variklio sąsaja sukūrimas
// ... automobilis newCar = naujas automobilis (); Variklis sixCylEngine = naujas InlineSixCylinderEngine (); newCar.setEngine (sixCylEngine); // Daryk daiktus su automobiliu
Atminkite, kad sukūrėte Automobilis
pirmiausia objektas. Tada sukuriate naują objektą, kuris atitinka Variklis
sąsają ir rankiniu būdu priskirkite ją Automobilis
objektas. Taip objektų asociacijos veikia paprastoje senoje „Java“.
Klasių ir objektų modeliavimas pavasarį
Dabar pažiūrėkime į tą patį pavasarį pateiktą pavyzdį. Čia galite padaryti kažką panašaus į tai, kas rodoma 3 sąraše. Pradėkite nuo Automobilis
klasę, tačiau šiuo atveju prie jos pridedate komentarą: @ Suleiskite
.
Sąrašas 3. Pvz., Kaip naudoti „Inject“ anotaciją pavasarį
viešosios klasės automobilio {@įšvirkškite privatų variklį; // ...}
Naudojant @ Suleiskite
anotacija (arba @Autowired
, jei norite) liepia Springui ieškoti konteksto ir automatiškai įterpti objektą į nuorodą, remiantis taisyklių rinkiniu.
Toliau apsvarstykite @Komponentas
anotacija, parodyta 4 sąraše.
4. sąrašas. Komponento anotacija
@Component public class „InlineSixCylinderEngine“ įgyvendina variklį {// ...}
Anotuoti klasę su @Komponentas
pavasariui sako, kad jį galima atlikti injekcijoms atlikti. Šiuo atveju „InlineSixCylEngine“
būtų švirkščiama, nes ji yra prieinama ir atitinka asociacijos sąsajos reikalavimus. Pavasarį tai vadinama „automatine“ injekcija. (Daugiau informacijos apie „Spring“ rasite žemiau @Autowired
anotacija.)
Atsiejimas kaip projektavimo principas
Valdymo inversija su priklausomybės įpurškimu pašalina konkrečios priklausomybės šaltinį iš jūsų kodo. Niekur programoje nėra griežtai užkoduotos nuorodos į Variklis
įgyvendinimas. Tai yra pavyzdys atsiejimas kaip programinės įrangos projektavimo principas. Programos kodo atsiejimas nuo įgyvendinimo palengvina kodo valdymą ir priežiūrą. Programa žino mažiau apie tai, kaip jos dalys dera tarpusavyje, tačiau daug lengviau atlikti pakeitimus bet kuriuo programos gyvavimo ciklo metu.
@Autowired vs @Inject
@Autowired
ir @ Suleiskite
daryk tą patį. Tačiau @ Suleiskite
yra „Java“ standarto anotacija, o @Autowired
būdinga pavasariui. Jie abu naudoja tą patį tikslą, liepdami DI varikliui įpurkšti lauką ar metodą su atitinkamu objektu. Galite naudoti bet kurį pavasarį.
Pavasario programos apžvalga
Dabar, kai pamatėte „Spring“ kodą, apžvelkime sistemą ir jos komponentus. Kaip matote, sistemą sudaro keturi pagrindiniai moduliai, kurie yra suskaidyti į paketus. Pavasaris suteikia jums pakankamai lankstumo naudojant modulius.
- Šerdies konteineris
- Šerdis
- Pupelė
- Kontekstas
- Išraiškos kalba
- Orientavimas į aspektą (AOP)
- AOP
- Aspektai
- Instrumentavimas
- Prieiga prie duomenų ir integravimas
- JDBC
- JPA / ORM
- JMS
- Sandoriai
- Žiniatinklis
- Žiniatinklis / POILSIS
- Servletas
- Statramsčiai
Užuot aprėpę viską čia, pradėkime nuo dviejų dažniausiai naudojamų „Spring“ funkcijų.
Pradedamas naujas projektas: „Spring Boot“
Norėdami sukurti pavyzdinį projektą, kurį naudosime demonstruodami „Spring Boot“, naudosime „Spring Boot“. „Spring Boot“ leidžia daug lengviau pradėti naujus projektus, kaip įsitikinsite patys. Norėdami pradėti, pažvelkite į žemiau pateiktą pagrindinę klasę. „Spring Boot“ galime pasiimti pagrindinę klasę su a pagrindinis ()
metodą, tada pasirinkite paleisti jį atskirai arba paketą, skirtą dislokuoti tokiame konteineryje kaip „Tomcat“.
5 sąraše yra mūsų pagrindinės klasės, kuri gyvens pagal standartą, kontūrai src / main / java / labas
vieta.
5 sąrašas. Pagrindinė klasė su „Spring Boot“
paketas labas; importuoti org.springframework.boot.SpringApplication; importuoti org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}
Atkreipkite dėmesį į du dalykus, susijusius su aukščiau pateiktu kodu: Pirma, visas darbas suskaidomas į sistemą. Pagrindinė klasė paleidžia programą, tačiau ji nieko nežino apie programos veikimą ar funkcionalumą. Antra, SpringApplication.run ()
atlieka faktinį darbą, paleidžiant programą ir perduodant Taikymas
pati klasė. Vėlgi, programos atliekamas darbas čia nėra akivaizdus.
@SpringBootApplication
anotacija sudaro keletą standartinių anotacijų ir liepia Springui pažvelgti į paketą, kuriame yra pagrindinė komponentų klasė. Ankstesniame mūsų pavyzdyje, naudojant automobilį ir variklį, pavasaris galėtų rasti visas klases, kuriose yra anotacijos @Komponentas
ir @ Suleiskite
. Pats procesas vadinamas komponentų nuskaitymas, yra labai pritaikoma.
Galite sukurti programą naudodami standartą mvn clean install
ir galite jį paleisti su „Spring Boot“ tikslu (mvn spring-boot: paleisti
). Prieš tai atlikdami, pažvelkime į šią programą pom.xml
failą.
Sąrašas 6. Pradedančiųjų pom.xml
„com.javaworld what-is-spring“ 1.0.0. org.springframework.boot spring-boot-starter-parent 2.1.3. IŠLEIDIMAS 1.8 org.springframework.boot spring-boot-maven-plugin
Atkreipkite dėmesį į dvi svarbias ankstesnio kodo funkcijas:
-
tėvas
elementas remiasipavasaris-pradinis-starteris-tėvas
projektą. Šis pagrindinis projektas apibrėžia keletą naudingų numatytųjų parametrų, pvz., Numatytąjį kompiliatoriaus lygį JDK 1.8. Daugeliu atvejų galite tikėti, kad jis žino, ką daro. Pavyzdžiui, galite praleisti versijos numerį daugeliui įprastų priklausomybių ir„SpringBootParent“
nustatys, kad versijos būtų suderinamos. Kai sutvarkysite tėvų versijos numerį, priklausomybės versijos ir numatytieji nustatymai taip pat pasikeis. -
spring-boot-maven-plugin
leidžia vykdyti vykdomą JAR / WAR pakuotę ir vietojepaleisti
(permvn spring-boot: paleisti
komanda).
„Spring Web“ įtraukimas kaip priklausomybė
Iki šiol mes galėjome naudoti spyruoklinis batas
apriboti, kiek įdėjome darbo, kad programa būtų paleista ir paleista. Dabar pridėkime priklausomybę ir pažiūrėkime, kaip greitai galime ką nors gauti naršyklėje.
Sąrašas 7. Pavasario žiniatinklio įtraukimas į projektą
org.springframework.boot spring-boot-starter-web
Pastaba
Pavasaris automatiškai aptiks pasikeitusius failus ir atitinkamai sukompiliuos. Galite tiesiog įvykdyti mvn spring-boot: paleisti
paimti pakeitimus.
Dabar, kai turime pagrindinę projekto sąranką, esame pasirengę pateikti du mūsų pavyzdžius.
2 pavyzdys: RESTful galinių taškų kūrimas naudojant „Spring Web“
Mes panaudojome „spring-boot-starter-web“
įvesti keletą priklausomybių, naudingų kuriant žiniatinklio programas. Tada sukursime URL kelio maršruto tvarkytuvą. „Spring“ žiniatinklio palaikymas yra „Spring MVC“ („Model-View-Controller“) modulio dalis, tačiau neleiskite to jaudinti: „Spring Web“ taip pat teikia visapusišką ir veiksmingą paramą kuriant RESTful galinius taškus.
Klasė, kurios užduotis yra įvesti URL užklausas, vadinama a valdiklis, kaip parodyta 8 sąraše.
Sąrašas 8. Pavasario MVC REST valdiklis
paketas labas; importuoti org.springframework.stereotype.Controller; importuoti org.springframework.ui.Model; importuoti org.springframework.web.bind.annotation.RequestMapping; importuoti org.springframework.web.bind.annotation.RequestMethod; importuoti org.springframework.web.bind.annotation.ResponseBody; importuoti 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") Stygos pavadinimas, modelio modelis ) {grąžinti "labas" + vardas; }}
„@Controller“ anotacija
@Valdytojas
anotacija klasę identifikuoja kaip valdiklį. Klasė, pažymėta kaip valdiklis, taip pat automatiškai identifikuojama kaip komponentų klasė, todėl ji gali tapti automatinio laido kandidatu. Kur tik reikalingas šis valdiklis, jis bus prijungtas prie sistemos. Šiuo atveju mes prijungsime jį prie MVC sistemos, kad galėtume tvarkyti užklausas.
Valdiklis yra specializuota komponentų rūšis. Jis palaiko @RequestMapping
ir @ResponseBody
anotacijos, kurias matote labas ()
metodas. Šios anotacijos nurodo sistemai, kaip susieti URL užklausas su programa.
Šiuo metu galite paleisti programą naudodami mvn spring-boot: paleisti
. Kai paspausite / labas
URL, gausite tokį atsakymą kaip „Sveiki,„ JavaWorld “.
Atkreipkite dėmesį, kaip pavasaris perėmė pagrindinius komponentų laidų teikimo pagrindus ir pateikė visą internetinę sistemą. Su „Spring“ jums nereikia nieko aiškiai susieti!
@Request anotacijos
@RequestMapping
leidžia apibrėžti URL kelio tvarkytuvą. Pasirinktys apima norimo HTTP metodo apibrėžimą, ką mes padarėme šiuo atveju. Palieka RequestMethod
išjungta nurodytų programai tvarkyti visus HTTP metodų tipus.
@RequestParam
argumentų anotacija leidžia mums susieti užklausos parametrus tiesiai į metodo parašą, įskaitant tam tikrų parametrų reikalavimą ir numatytųjų reikšmių apibrėžimą, kaip tai darėme čia. Mes netgi galime susieti užklausos turinį su klase @RequestBody
argumentų anotacija.
REST ir JSON atsakymas
Jei kuriate REST galinį tašką ir norite grąžinti JSON iš metodo, galite metodą anotuoti @ResponseBody
. Tada atsakymas bus automatiškai supakuotas kaip JSON. Tokiu atveju grąžinsite objektą iš metodo.
MVC naudojimas su „Spring Web“
Panašiai kaip „Struts“, „Spring Web“ modulį galima lengvai naudoti tikram modelio rodinio valdiklio nustatymui. Tokiu atveju jūs grąžinsite žemėlapį nurodyta šablono kalba (pvz., „Thymeleaf“), o „Spring“ išspręs susiejimą, pateiks jam perduotą modelį ir pateiks atsakymą.
3 pavyzdys: pavasaris su JDBC
Padarykime ką nors įdomesnio su savo užklausų tvarkytuvu: grąžinkime duomenis iš duomenų bazės. Šiame pavyzdyje naudosime H2 duomenų bazę. Laimei, „Spring Boot“ palaiko atmintyje esančią H2 DB iš dėžutės.