当前位置: 首页 > 工具软件 > Spring Scala > 使用案例 >

Spring Boot 实践折腾记(16):使用Scala

彭霄
2023-12-01

英国作家萨缪尔·约翰逊曾说过,成大事不在于力量的大小,而在于能坚持多久。

前面我们介绍了如何在Spring Boot下使用Kotlin和Groovy,还有一个热门语言是Scala,做大数据的同学对Scala应该很熟悉,虽然他是JVM技术栈的成员,但是入门有一定门槛,加上学习曲线很陡峭,除了的确是工作上强相关不得不学习外,就让很多爱好者望而却步,一方面没有真实的大数据环境可以模拟,另一方面学习起来很枯燥,如果你依然还是想了解下他,那请继续往下看。本文将介绍如何在Spring Boo中使用Scala语言来编程。

Scala

Scala现在已经是最流行的基于JVM的编程语言之一。它是将函数式编程和面向对象编程习惯用法融合成一种语言的新编程语言。

目前,Spring初始器(http://start.spring.io)依然还是不支持Scala,但我们可以在IDE中来使用Scala编程语言环境来创建和集成Spring Boot应用程序,方法很简单,就是根据使用的构建工具配置合适的插件既可以了。接下来的几节将介绍一些与Java略有不同的Scala特性。

类型推断

在Scala中,变量声明语法是像var variable_name:data_type = value。但是Scala可以根据指定的值推断变量的数据类型。这意味着我们可以在声明中省略——data_type部分,如下声明代码:

var n : Int = 5 //with explicit type declaration
var n = 5 //with type inference

类和对象

Scala中的类与Java类似,可以包含变量,方法等。但是在Scala中,类可以包含一个主构造函数和零个或多个辅助构造函数。 辅助构造函数直接或通过另一个辅助构造函数调用主构造函数。

class Hello (val firstName: String, val lastName: String){
  def this(firstName: String) { this(firstName, "")}
}
object Main extends App {
  val p1 = new hello("mickjoust","huang")
  val p2 = new hello("mickjoust")
}
````
在Scala中,是没有静态的概念的。 如果我们想在Scala中模拟静态行为,可以创建一个与该类名称相同的伴随对象,并将所有成员(包括属性和方法)放在该对象中。 Scala中的对象是一个单例,您可以在不创建实例的情况下访问成员。




<div class="se-preview-section-delimiter"></div>

``` scala
class Hello{...}。。。//接上面的类
object Hello {
  def toUpper(str: String): String = {
    return str.toUpperCase()
  }
}
object Main extends App {
  ... //省略
  println(Hello.toUpper("mickjoust"))
}

Traits

Scala中的特征类似于Java 8接口,可以封装字段,默认方法和接口方法。

trait TestTest {
  def sendReport(report: String): Unit = {
    //模拟发送emal的content代码
  }
  def generateReport() : String
}
class HTMLSender extends TestTest {
  override def generateReport(): String = "<html><body>ReportData</body></html>"
}

实战:使用Scala创建Spring Boot应用程序

我们还是用Maven作为构建工具,并使用scala-maven-plugin来编译我们的Scala代码。 同理,新增项目目录,讲源代码放在src / main / scala中,将测试代码放在src / test / scala文件夹中。

这里同样要注意,增加Scala库的依赖来使用Scala,如下POM文件:

<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>2.12.5</version>
</dependency>
...//还要增加编译插件
<!--scala-->
<plugin>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>scala-maven-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <jvmArgs>
            <jvmArg>-Xms64m</jvmArg>
            <jvmArg>-Xmx1024m</jvmArg>
        </jvmArgs>
    </configuration>
</plugin>

第一步,创建示例Bean:Man.scala,如下代码:

class Man(ids :Int,names: String,emails: String ) {
  var id: Int = ids
  var name: String = names
  var email: String = emails
}

同样是构造函数放开头,注意变量声明语法和Java的区别。

第二步,创建一个模拟查询服务接口:ManService.scala和 接口实现:ManServiceImpl.scala,如下代码:

trait ManService {
  def findByName(name: String): Man
}
@Service
class ManServiceImpl extends ManService {
  override def findByName(name: String) = new Man(1,name,"test@test")
}

第三步,创建一个REST API,如下代码:

@RestController
class HomeController {

  @Autowired
  var manService:ManService = _

  @GetMapping(Array("/ok"))
  def home() : String = {
    val man = manService.findByName("mickjoust")
    "ok ==> scala:"+"id:"+man.id+" name:"+man.name+" email:"+man.email
  }

}

最后一步,创建启动app:RunApp.scala,如下代码:

@SpringBootApplication
class RunApp {
}
object RunApp {
  def main(args: Array[String]) : Unit = {
    SpringApplication.run(classOf[RunApp], args:_*)
  }
}

到此,启动应用,成功!访问:http://localhost:8080/ok,输入:

ok ==> scala:id:1 name:mickjoust email:test@test

小结

本文介绍了,如何在Spring Boot中是用Scala编程环境,虽然使用场景有点别扭,但是通过实战证明了Spring Boot如何能快速的支撑能够支持编程语言环境。

参考资源

1、Spring Boot官方文档
2、要了解有关Scala的更多信息,请参阅Scala的官方文档:http://docs.scala-lang.org/index.html


我的其它穿越门——持续践行,我们一路同行。
头条号:【说言风语】
简书ID:mickjoust
公号:一【个行动

 类似资料: