Programavimas

Kas yra pavasaris? Komponentais pagrįstas „Java“ kūrimas

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 installir 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:

  1. tėvas elementas remiasi pavasaris-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.
  2. spring-boot-maven-plugin leidžia vykdyti vykdomą JAR / WAR pakuotę ir vietoje paleisti (per mvn 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.

$config[zx-auto] not found$config[zx-overlay] not found