原文首发于微信公众号:躬行之(jzman-blog)
Spring Boot 是用来简化 Spring 应用程序的开发的,可以减少不必要的配置过程,其主要特性包括 Spring Boot Starter、自动配置、命令行接口、Actuator 等,作为 Android 开发者对 Spring Boot 的学习将以会使用为主,所有文章会基于对应的案例,本篇文章将从以下几个方面介绍如何使用 Spring Boot 开发一个接口:
- Spring Boot项目初始化
- 使用IDEA创建Spring Boot项目
- Spring Boot项目目录结构
- 简述POM文件
- 实现一个简单的接口
- 接口测试
Spring Boot项目初始化
创建 Spring 应用程序都是从 Spring Initializr 开始,可以快速的选择项目的依赖项,可以访问 https://start.spring.io/
来完成 Spring 应用程序的创建,如下图所示:
通过配置可生成对应配置信息的项目源码包,使用 IntelliJ IDEA 或其他 IDE 打开即可。
使用IDEA创建Spring Boot项目
最常见的方式肯定是使用 IDE 来进行 Spring 相关项目的创建,这里选择 IntelliJ IDEA 来创建 Spring Boot 项目。
第一步:选择 File->New->Project,如下:
第二步:选择 Spring Initializr,Project SDK 至少为 JDK 1.8,然后选择 Next:
第三步:根据项目配置项目信息,然后选择 Next:
第四步:选择 Web->Spring Web 以及 Spring Boot 的版本,这一步实际上就是为该项目添加了支持 Web 开发的依赖,之后会在 pom 文件中看到相关依赖,然后选择 Next:
第五步:选择 Finish 完成项目的创建:
Spring Boot项目目录结构
Spring Boot 项目的主要目录结构如下:
│ pom.xml
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─manu
│ │ └─hello
│ │ SpringBootHelloWorldApplication.java
│ │
│ └─resources
│ │ application.properties
│ │
│ ├─static
│ └─templates
└─test
└─java
└─com
└─manu
└─hello
SpringBootHelloWorldApplicationTests.java
主要目录与文件介绍如下:
- pom.xml:项目基于 mavan 的依赖配置文件,如果项目基于 gradle,则有对应的 gradle 文件;
- src/main/java:项目源代码目录;
- src/main/resources:资源文件目录;
- src/test:测试文件目录;
- application.properties:配置文件,也可以使用 yml 文件进行配置;
- static:静态资源文件目录,如 html、css、js 等;
- templates:模板文件目录,如 Thymeleaf 等;
- SpringBootHelloWorldApplication:项目启动类。
简述POM文件
POM 是项目对象模型(Project Object Model)的简称,maven 项目通过 xml 来进行项目配置,pom.xml 就是用来配置 maven 项目的,pom.xml 文件类似于 Android 开发中的 build.gradle 文件,当然 Spring Boot 项目也可以使用 gradle 来进行构建,主要用来管理项目依赖、配置项目信息等,来看一下 Spring Web 项目的 pom 文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--pom模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!--继承的父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<!--项目信息-->
<groupId>com.manu</groupId>
<artifactId>spring-boot-hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--项目产生的构件类型,默认jar,其他如war、rar、ejb、ear、par等-->
<packaging>jar</packaging>
<name>spring-boot-hello-world</name>
<description>Spring Boot sample for Hello World!</description>
<!--属性设置-->
<properties>
<java.version>1.8</java.version>
</properties>
<!--依赖-->
<dependencies>
<!--支持Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--编译-->
<build>
<!--插件-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
至于 pom 文件的其他具体配置这里不做细究。
实现一个简单的接口
根据上面步骤项目已经创建好了,项目启动类如下:
@EnableAutoConfiguration
@ComponentScan
@Configuration
//@SpringBootApplication
public class SpringBootHelloWorldApplication {
public static void main(String[] args) {
// 启动程序,包括Spring容器、内嵌的Tomcat等
SpringApplication.run(SpringBootHelloWorldApplication.class, args);
}
}
其中 @SpringBootApplication
相当于 @EnableAutoConfiguration
、@ComponentScan
和 @Configuration
一起使用,主要用来配置启动类,这里将在此基础上实现一个接口,首先创建一个 MessageBean
作为返回的实体类,如下:
/**
* @Desc: MessageBean
* @Author: jzman
* @Date: 2020/3/6 15:51.
*/
public class MessageBean {
private long id;
private String author;
private String message;
public MessageBean(long id, String author, String info) {
this.id = id;
this.author = author;
this.message = info;
}
// ...
}
然后,创建对应的控制器类,其中注解 @RestController
将类 HelloWorldController
标记为一个控制器,该类里面的方法的返回都将被转换成对象而不是页面视图,等价于注解 @Controller
和 @ResponseBody
一起使用。
返回的 MessageBean
将会被转换成 json
,这个过程由 Spring 的 HTTP 消息转换器自动支持,最终使用 MappingJackson2HttpMessageConverter
将 MessageBean
对象转换为对应的 json
格式
/**
* @Desc: HelloWorldController
* @Author: jzman
*/
//@Controller
//@ResponseBody
@RestController
public class HelloWorldController {
private final AtomicLong counter = new AtomicLong();
// @RequestMapping(value = "/message", method = RequestMethod.GET)
@GetMapping("/message")
public MessageBean message(@RequestParam(name = "author", defaultValue = "jzman") String author,
@RequestParam(name = "message", defaultValue = "Hello world!") String message) {
return new MessageBean(counter.incrementAndGet(), author, message);
}
}
@RestController
相当于 @Controller
和 @ResponseBody
一起使用的效果,就是将 Controller 中返回的对象转换为对应的格式。
@Controller
负责的类的注入操作,这里不进行深入,如果用过 Android 开发中的 Dagger 框架可有助于理解注解 @Controller
的使用,@ResponseBody
主要是标识将返回的对象转换为特定的格式,默认是 json 格式。
@RequestMapping
用于地址映射,可在类上和方法上使用,如果在类上使用,该类中所有响应请求的方法都要以此为父路径,如果在方法上使用则表示当前响应的路径,如上代码中实现一个 GET 请求可以使用 @RequestMapping
,也可以使用 @GetMapping
, @GetMapping
实际上默认指定了请求方法为 RequestMethod.GET
,此外 @RequestParam
用来配置请求参数。
接口测试
运行 SpringBootHelloWorldApplication
,运行成功截图如下:
访问下面接口查看返回的数据:
http://localhost:8080/message?author=jzman&message=Hello
返回数据如下:
{"id":3,"author":"jzman","message":"Hello"}
至此,使用 Spring Boot 实现了一个简单的接口,接口配置方式类似于 Android 开发中的 Retryfit,使用注解轻松完成相关配置。