Proljetni čizma i Kotlin
1. Pregled
Velika najava objavljena je još u siječnju u ekosustavu Proljeće: Podrška za Kotlin dolazi na Spring Framework 5. To znači da će Spring Boot 2.x imati prvoklasnu podršku za Kotlin.
To naravno nije neočekivano, jer je tim u Pivotalu poznat po prihvaćanju JVM jezika kao što su Scala i Groovy.
Izgradimo aplikaciju Kotlin pomoću Spring Boot aplikacije 2.x!
2. Postavljanje
2.1. Okoliš
Kotlin podržava razvoj u IntelliJ, Eclipse i na naredbenom retku. Slijedite upute za postavljanje svog okruženja na temelju svojih želja.
2.2. Postaviti
Prvo, izradimo projekt Spring Boot 2 i izmijenimo POM tako da sadrži unose koji navode verzije Jave i Kotlina s ovisnostima:
org.jetbrains.kotlin kotlin-stdlib-jre8 1.2.71 org.jetbrains.kotlin kotlin-Reflection 1.2.71 com.fasterxml.jackson.module jackson-module-kotlin 2.9.9
Imajte na umu da odredujemo mjesta datoteka za izvorne i testne datoteke Kotlin:
$ {project.basedir} / src / main / kotlin $ {project.basedir} / src / test / kotlin
Ako su naše datoteke Kotlin na različitim lokacijama, morat ćete izmijeniti ove unose u POM-u.
Da bismo kompilirali Kotlin module i izvore, trebamo koristiti kotlin-maven-plugin:
kotlin-maven-plugin org.jetbrains.kotlin 1.1.2 proljeće 1.8 compile compile compile test-compile test-compile test-compile org.jetbrains.kotlin kotlin-maven-allopen 1.1.2
U redu, sada imamo sve što nam je potrebno za izgradnju naše aplikacije Kotlin. Za referencu: možete pronaći najnovije verzije Maven Central (spring-boot-starter-web, kotlin-stdlib-jre8, kotlin-reflect, jackson-module-kotlin, test).
Dalje, postavimo kontekst aplikacije.
3. Kontekst aplikacije
Uđimo u neki Kotlin kod i napišite nam poznati kontekst aplikacije Spring Boot:
@SpringBootApplication klasa KotlinDemoApplication zabavna glavna (args: Array) {SpringApplication.run (KotlinDemoApplication :: class.java, * args)}
Vidimo svoje poznato @SpringBootApplication bilješka. To je ista napomena koju bismo koristili u Java klasi.
Ispod toga imamo definiciju klase za naš KotlinDemoApplication razred. U Kotlinu je zadani opseg klasa javan, tako da to možemo izostaviti. Uz to, ako klasa nema varijable i nema funkcija, može se deklarirati bez kovrčavih zagrada. U osnovi, upravo smo definirali klasu.
Prelazak na metodu. Ovo je standardna metoda Java točke ulaska u Javi: javna statička void glavna (String [] args).
Opet, metode ili funkcije su prema zadanim postavkama javne, pa to ovdje ne moramo deklarirati. Dodatno, funkcije koje ne vraćaju ništa ne trebaju specificirati void tip povratka.
I konačno, bilo koja funkcija definirana izvan tijela klase automatski je statična. To ovu funkciju čini prihvatljivom za pokretanje.
A sada pokrenimo našu aplikaciju iz korijenskog direktorija pomoću mvn spring-boot: trčanje. Aplikacija bi se trebala pokrenuti, a mi bismo trebali vidjeti kako se naša aplikacija izvodi na portu 8080.
Dalje, izgradimo kontroler.
4. Kontroler
Pogledajmo dodavanje kontrolera u našu uslugu:
Klasa @RestController HelloController {@GetMapping ("/ hello") fun helloKotlin (): String {return "hello world"}}
Ne razlikuje se previše od standardnog Spring regulatora, ali sigurno manje koda. Dodajmo klasu ispitivanja i slučaj za ovaj kontroler kako bi potvrdio naš rad:
@RunWith (SpringRunner :: class) @SpringBootTest (classes = arrayOf (KotlinDemoApplication :: class), webEnvironment = SpringBootTest. // ... .getForEntity ("/ hello", String :: class.java) assertNotNull (rezultat) assertEquals (rezultat? .statusCode, HttpStatus.OK) assertEquals (rezultat? .body, "hello world")}}
Ovaj test pokazuje jednu od vrlo moćnih Kotlinovih značajki - nultu sigurnost! Kotlin varijable koje mogu biti null moraju se deklarirati pomoću '?'. Kompajler tada zna da je potrebno obrambeno kodiranje prije pristupanja tom svojstvu.
U našem testu, TestRestTemplate definira se kao nullable tip i svaki put kad mu pristupimo, to činimo pomoću null operatora spajanja "?". - koji će vratiti nulu ako je pozvani objekt null.
Ovo pojašnjava upotrebu nula u programu i prisiljava programere da napišu siguran kôd kada rade s njima.
Dalje, dodajte uslugu i integrirajte je u naš kontroler.
5. Usluga
Kao što sada vjerojatno možete pretpostaviti, našu će uslugu biti prilično lako dodati u naš projekt. Učinimo to sada:
@Service klasa HelloService {zabava getHello (): Niz {return "hello service"}}
Ovdje je prilično jednostavna usluga s jednom funkcijom koja vraća String. Dalje, spojimo našu uslugu u kontroler i pomoću nje vratimo vrijednost:
@RestController klasa HelloController (val helloService: HelloService) {// ... @GetMapping ("/ hello-service") fun helloKotlinService (): String {return helloService.getHello ()}}
Ahh, to izgleda lijepo! U Kotlinu se glavni konstruktor može definirati u skladu s deklaracijom klase. Izostavili smo @Autowired napomena našeg konstruktora jer nije obavezna već neko vrijeme.
Ti se parametri automatski pretvaraju u polja u klasi. Kotlin nazivaju se svojstvima. Nema definiranih getera ili postavljača; stvaraju se automatski. Ako želite, možete poništiti ove zadane postavke.
U Kotlinu se svojstva u klasama i varijable u funkcijama mogu definirati pomoću var ili val. Var označava promjenjivo svojstvo, i val označava konačni. To omogućuje prevoditelju da provjeri ima li ilegalnog pristupa. Od našeg HelloService je singleton, povezujemo ga kao a val kako bi se spriječila mutacija.
Dalje, dodajmo test za ovu metodu kontrolera:
@Test zabave whenCalled_shouldReturnHelloService () {var result = testRestTemplate // ... .getForEntity ("/ hello-service", String :: class.java) assertNotNull (rezultat) assertEquals (rezultat? .StatusCode, HttpStatus.OK) assertEquals ( rezultat? .body, "hello service")}
Na kraju, pogledajmo kako POJO izgleda u Kotlinu.
6. Razred podataka Kotlin
U Javi predstavljamo podatkovne objekte s običnim starim Java objektima, POJO. U Kotlinu imamo nešto što nam omogućuje da sažetiji izrazimo ovu vrstu predmeta - klasu podataka.
Napišimo objekt podataka koji ćemo vratiti u naš kontroler:
podatkovna klasa HelloDto (pozdrav: val)
To nije bio trik. Ne izostavljam ništa iz našeg razreda. Pomoću modifikatora podataka dobivamo puno prednosti. Ova ključna riječ automatski stvara jednako / hashcode par, a toString funkcija i funkcija kopiranja. Sve to od 53-linijske jednoslojne linije!
Sad dodajmo metodu za vraćanje nove klase podataka:
// ... @GetMapping ("/ hello-dto") fun helloDto (): HelloDto {return HelloDto ("Hello from the dto")}
Modifikator podataka ne dodaje zadani konstruktor, što je važno za određene knjižnice kao što je Jackson. Da bismo podržali ovu vrstu klase dodali smo jackson-module-kotlin u našu POM datoteku za podršku marširanju. To je učinjeno tijekom 2. odjeljka i tamo možete vidjeti ovisnost.
Na kraju, dodajmo test za ovu funkciju kontrolera:
@Test zabave whenCalled_shoudlReturnJSON () {val rezultat = testRestTemplate // ... .getForEntity ("/ hello-dto", HelloDto :: class.java) assertNotNull (rezultat) assertEquals (rezultat? .StatusCode, HttpStatus.OK) assertEquals ( rezultat? .body, HelloDto ("Hello from the dto"))}
7. Zaključak
U ovom smo članku pogledali podršku za Kotlin u Spring Boot 2.x. Iz primjera smo vidjeli da bi Kotlin mogao pojednostaviti i poboljšati naše programe prisiljavajući nas da napišemo kraći, sigurniji kod.
Kotlin također podržava neke nevjerojatne značajke poput klase podataka, proširenja klase i u potpunosti je kompatibilan s postojećim Java kodom. To znači da možete napisati Kotlin kod i nazvati ga iz svojih Java klasa i obrnuto. Uz to, Kotlin je izgrađen od temelja kako bi imao fantastičnu podršku u IDE-u, i ima ga.
Puno je razloga za isprobavanje Kotlina, a uz podršku Googlea i Springa, sada je vrijeme da to provjerite. Javite nam što ste odlučili graditi koristeći ga!
Izvorni kod uvijek možete pronaći na GitHubu.