跳至主要內容

Spring Boot 快速入门指南

未央大约 3 分钟spring bootspringspring boot

获取 Spring Boot 项目模板

https://start.spring.io/open in new window上按下图指示生成项目:

quick
quick

写点代码

打开刚才生成的项目,在src/main/java/com/example/demo目录下找到DemoApplication.java文件,修改内容如下:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping("/hello")
    public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
        return String.format("Hello %s!", name);
    }
}

相比于刚生成的代码我们在class上添加了@RestController注解,这个注解告诉spring这个class现在是一个Controller了,而且是Rest了的Controller

停一下,我先简单的解释一下Http模型。Http规范的应用实际上拥有一个很简单的模型,那就是客户端发起请求,服务端返回响应,这种简单的,一个响应对应一个请求的模型。

基于这个模型来解释一下ControllerController就是用来将客户端的请求转发到对应的处理方法的,简而言之就是路由。理解了这个概念你也就知道了为什么不应该在Controller里写业务逻辑了。正是这个原因,在WebFlux中直接就没有了Controller这个东西,取而代之的是Router

Controller前面加了个Rest是啥意思呢?这题我会,在很久很久以前,那时候还没有前后端分离、微服务这些概念,网站的页面也是集成在后端的,以模板的形式出现。Controller需要将最终注入了数据的视图,也就是页面发送到客户端,所以Controller是配合视图解析器返回页面的。加了Rest就简单了,不用搞这些花里胡哨的了,业务逻辑处理完,数据直接Json处理一下返回给客户端。

接下来我们看这段代码:

@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
    return String.format("Hello %s!", name);
}

这段代码穿的衣服太多了,我们先把她的衣服脱掉:

public String hello(String name) {
    return String.format("Hello %s!", name);
}

这还用解释吗?既然代码这么简单,我们就看看她的衣服到底有什么不一样。

她穿的第一件衣服是@GetMapping("/hello"),简单,这衣服告诉spring,这个方法用来处理访问到/hello这个地址上的请求,且只处理访问到该地址的GET请求。

第二件衣服@RequestParam(value = "name", defaultValue = "World"),这是穿在hello方法的参数name上的。它说要把请求参数中的name参数(value = "name")和方法的name参数(String name)绑定在一起。如果name参数没有出现在请求中或者为空的话,那就取默认值"World"

这里的请求参数指Query StringsQuery Strings就是请求行?后面跟的那一串用&=连起来的字符串,示例如下:

http://www.example.com?search=ruby&results=10

启动项目

打开终端,进入项目根目录,执行如下命令:

MacOS/Linux:

./mvnw spring-boot:run

Windows:

mvnw spring-boot:run

看到如下输出:

$ ./mvnw spring-boot:run
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------< com.example:demo >--------------------------
[INFO] Building demo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.5.4:run (default-cli) > test-compile @ demo >>>
[INFO]
...

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.4)

...
2021-08-26 12:42:46.810  INFO 4644 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
...
2021-08-26 12:42:47.774  INFO 4644 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
...
2021-08-26 12:42:54.335  INFO 4644 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms

现在我们发个请求看看效果:

$ curl -s localhost:8080/hello
Hello World!
$ curl -s localhost:8080/hello?name=laoli
Hello laoli!

可以看到,当请求中没有name参数时,使用默认值"World"

(完)