当前位置: 移动技术网 > IT编程>开发语言>Java > 关于Spring Boot和Kotlin的联合开发

关于Spring Boot和Kotlin的联合开发

2019年07月22日  | 移动技术网IT编程  | 我要评论

一、概述

spring官方最近宣布,将在spring framework 5.0版本中正式支持kotlin语言。这意味着spring boot 2.x版本将为kotlin提供一流的支持。

这并不会令人意外,因为pivotal团队以广泛接纳​​jvm语言(如scala和groovy)而闻名。下面我们用spring boot 2.x和kotlin应用程序。

二、搭建环境

1、环境

intellij和eclipse都对kotlin提供了支持,可以根据自己的喜好搭建kotlin开发环境。

2、构建应用

首先创建一个spring boot 2项目,然后修改pom配置,让项目保护指定的java版本和kotlin版本。依赖关系如下:

<dependency>
  <groupid>org.jetbrains.kotlin</groupid>
  <artifactid>kotlin-stdlib-jre8</artifactid>
  <version>1.1.2</version>
</dependency>
<dependency>
  <groupid>org.jetbrains.kotlin</groupid>
  <artifactid>kotlin-reflect</artifactid>
  <version>1.1.2</version>
</dependency>
<dependency>
  <groupid>com.fasterxml.jackson.module</groupid>
  <artifactid>jackson-module-kotlin</artifactid>
  <version>1.1.2</version>
</dependency>

注意,我们正在为kotlin源码文件和测试文件指定文件位置:

<sourcedirectory>${project.basedir}/src/main/kotlin</sourcedirectory>
<testsourcedirectory>${project.basedir}/src/test/kotlin</testsourcedirectory>

要编译kotlin模块和源码,需要使用kotlin-maven-plugin插件:

<plugin>
  <artifactid>kotlin-maven-plugin</artifactid>
  <groupid>org.jetbrains.kotlin</groupid>
  <version>1.1.2</version>
  <configuration>
    <compilerplugins>
      <plugin>spring</plugin>
    </compilerplugins>
    <jvmtarget>1.8</jvmtarget>
  </configuration>
  <executions>
    <execution>
      <id>compile</id>
      <phase>compile</phase>
      <goals>
        <goal>compile</goal>
      </goals>
    </execution>
    <execution>
      <id>test-compile</id>
      <phase>test-compile</phase>
      <goals>
        <goal>test-compile</goal>
      </goals>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupid>org.jetbrains.kotlin</groupid>
      <artifactid>kotlin-maven-allopen</artifactid>
      <version>1.1.2</version>
    </dependency>
  </dependencies>
</plugin>

到此为止,构建kotlin应用程序所需的一切就搭建好了。注意,可以去maven中央仓库寻找以下组件的最新版本:spring-boot-starter-web、kotlin-stdlib-jre8、kotlin-reflect、jackson-module-kotlin、spring-boot-starter-test。
下面设置应用程序的上下文。

3、应用程序上下文

下面进入kotlin的代码,编写熟悉的spring boot应用程序上下文:

@springbootapplication
class kotlindemoapplication
fun main(args: array<string>) {
  springapplication.run(kotlindemoapplication::class.java, *args)
}

可以看到熟悉的@springbootapplication注解。

我们有一个类定义了kotlindemoapplication类。在kotlin中,类的默认范围是public,所以可以省略。另外,如果一个类没有变量、没有函数,它可以被声明为没有大括号。所以,从本质上讲,我们只是定义了一个类。

另外,方法或函数默认是公开的,所以不必在这里声明。另外,不返回任何内容的函数不需要指定一个void返回类型。

最后,在一个类的外部定义的任何函数都是自动静态的。这使得这些函数可以在启动时得到执行。

现在让我们从根目录运行我们的应用程序,使用mvn spring-boot: run。应用程序得以启动,应该可以看到应用程序在端口8080上运行。

接下来,构建一个控制器。

4、控制器

现在添加一个控制器到服务中:

@restcontroller
class hellocontroller {
  @getmapping("/hello")
  fun hellokotlin(): string {
    return "hello world"
  }
}

与标准的spring控制器没有太大的不同,但是肯定代码量更精简。我们为此控制器添加一个测试类和案例来验证我们的工作:

@runwith(springrunner::class)
@springboottest(classes = arrayof(kotlindemoapplication::class), 
webenvironment = springboottest.webenvironment.random_port)
class kotlindemoapplicationtests {
  @autowired
  lateinit var testresttemplate: testresttemplate
  @test
  fun whencalled_shouldreturnhello() {
    val result = testresttemplate
    // ...
    .getforentity("/hello", string::class.java)
    assertnotnull(result)
    assertequals(result?.statuscode, httpstatus.ok)
    assertequals(result?.body, "hello world")
  }
}

这个测试显示了kotlin强大的功能之一——null安全!可以为null的kotlin变量必须使用“?”声明。然后,编译器知道在访问该属性之前需要进行防御性编码。

在我们的测试中,testresttemplate被定义为可空类型,每次访问它时,我们使用null合并运算符“?”来实现——如果被调用对象为空,则返回null。

这声明了在程序中使用null,并强制开发人员在使用它们时编写安全的代码。

接下来,我们添加一个服务并将其集成到我们的控制器中。

5、服务

服务很容易添加到我们的项目中。这样做:

@service
class helloservice {

  fun gethello(): string {
    return "hello service"
  }
}

这里的简单服务与单个函数返回一个string。接下来,让我们将服务连接到控制器中并使用它来返回值:

@restcontroller
class hellocontroller(val helloservice: helloservice) {
  // ...

  @getmapping("/hello-service")
  fun hellokotlinservice(): string {
    return helloservice.gethello()
  }
}

啊,看起来不错!在kotlin中,主构造函数可以与类声明一起定义。我们从构造函数中省略了@autowired注释,因为它不是一段时间的强制性的。

这些参数将自动转换为类中的字段。kotlin称它们为属性。无需定义getter或setter方法,因为它们是自动创建的。当然,如果需要,您可以覆盖这些默认值。

在kotlin中,函数中的类和变量的属性可以使用var或val来定义。var表示可变属性,val表示final属性。这允许编译器检查非法访问。由于helloservice是一个单例,所以我们把它连接成一个val来防止突变。

接下来,我们为此控制器方法添加一个测试:

@test
fun whencalled_shouldreturnhelloservice() {
  var result = testresttemplate
  // ...
  .getforentity("/hello-service", string::class.java)
  assertnotnull(result)
  assertequals(result?.statuscode, httpstatus.ok)
  assertequals(result?.body, "hello service")
}

最后,我们来看看一个pojo在kotlin中的样子。

6、kotlin的数据类

在java中,我们使用po​​jo来表示数据对象。在kotlin中,可以更简洁地表达这种类型的对象——一个数据类。

我们写一个数据对象返回到控制器中:

data class hellodto(val greeting: string)

这里没有什么窍门,自动省略。使用data修饰符,可以获得很多好处。此关键字会自动创建一个equals()方法和hashcode()方法,以及tostring()方法和copy()方法。所有这些方法一个修饰符就搞定了。

现在我们来添加一个返回新数据类的方法:

// ...
@getmapping("/hello-dto")
fun hellodto(): hellodto {
  return hellodto("hello from the dto")
}

数据修饰符不添加默认构造函数,这对于像jackson这样的库很重要。为了支持这种类型的类,我们将jackson-module-kotlin添加到我们的pom文件中以支持编组。

最后,我们添加一个这个控制器功能的测试:

@test
fun whencalled_shoudlreturnjson() {
  val result = testresttemplate
  // ...
  .getforentity("/hello-dto", hellodto::class.java)

  assertnotnull(result)
  assertequals(result?.statuscode, httpstatus.ok)
  assertequals(result?.body, hellodto("hello from the dto"))
}

三、结论

在本文中,结合spring boot 2.x和kotlin语言,我们完成了一个demo应用。从示例中可以看到,kotlin可以通过强制来精简代码,保证更安全的代码来简化和增强我们的应用程序。

kotlin还支持一些惊人的功能,如数据类、类扩展,并与现有的java代码完全兼容。这意味着开发者可以编写kotlin代码,并从java类中调用它,反之亦然。此外,kotlin是从一开始就建立起来的,在ide中能得到非常好的支持。

google和spring都开始支持kotlin语言,或许使用kotlin的时候到了。

以上所述是小编给大家介绍的关于spring boot和kotlin的联合开发,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网