Spring Boot(一):快速开始

本系列文章旨在使用最小依赖、最简单配置,帮助初学者快速掌握Spring Boot各组件使用,达到快速入门的目的。全部文章所使用示例代码均同步Github仓库和Gitee仓库。

1. Spring Boot是什么?

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

讲的通俗一点就是Spring Boot并不是一个新的框架,它只是整合和默认实现了很多框架的配置方式。

2. 好处是什么?

最大的好处就是简单、快捷、方便,在Spring Boot之前,我们如果要搭建一个框架需要做什么?

  • 配置web.xml,加载Spring和Spring MVC,加载各种过滤器、拦截器
  • 在配置文件application.xml中配置数据库、配置缓存、配置连接池等等
  • 配置日志文件
  • 配置各种配置文件的读取
  • 配置上下文、配置定时任务
  • ...
  • 各种各样的配置
  • ...

笔者手边正好有一个很久之前的项目,当时还是使用的Spring3.x,可以给各位看一下当时一个项目的配置文件有多少:

而我如果需要新建一个项目,这里面大量的配置文件都要copy过去,并且重新调试,非常的不方便且浪费时间,当Spring Boot横空出世的时候,这些噩梦都结束了。

Spring Boot的优势:

  • 为所有Spring开发者更快的入门
  • 开箱即用,提供各种默认配置来简化项目配置
  • 内嵌式容器简化Web项目
  • 没有冗余代码生成和XML配置的要求

3. 快速入门

目标设定:构建一个简单的RESTful API并实现对应的单元测试

3.1 工程构建方式

Spring Boot提供两种工程构建方式:

关于创建springcloud项目,目前有两种比较方便的方案,核心都是一样的,大家自行选择自己使用方便的。

方式一:

打开spring的官方链接:

https://start.spring.io/

在 Group 中填入自己的组织,一般填写公司的域名的到写,例如 com.jd 或者 com

.baidu ,这里我直接写 com.springboot

在 Artifact 中填写工程的名称,这里我直接写 spring-boot-quick-start 。

package 选择 jar ,java 选择11(目前最新的LTS版本),至此,基础选择已经全都选完,接下来要开始选择我们使用的 Spring Boot 的组件了。

在 Dependencies 中找到 Spring Web ,选择 Spring Web ,结果如下图:

最后点击下方的绿色长条按钮 Generate the project 进行下载,等待下载完成后,直接将压缩包解压导入我们的编辑工具idea里即可。

方式二:

基于 idea 创建,打开 idea ,首先 file->new->project ,选中 Spring Initializr ,这时可以看到右侧让我们选择一个初始化的服务url,默认的就是上面的官方链接,https://start.spring.io/

点击 next 下一步,填写和上面一样的 Group 、 Artifact 、 java 版本、 package 方式等信息,继续 next 下一步,选择依赖,和前面的方法的一样,在 Dependencies 中找到 Spring Web ,选择 Spring Web ,点击 next ,选择项目名称和存储路径,点击 finish ,静静等一会,第一个项目 spring-boot-quick-start 就新鲜出炉了~~~

我一般选择第一种方式创建 Spring Boot 项目,这种方式不依赖IDE工具。

3.2 工程结构解析

首先先看一下我们创建的工程结构,如下图:

  • pom.xml:maven工程配置文件,主要配置当前工程的一些基本信息,包含我们当前使用的组件,版本等信息。
  • src/main/java下的程序入口:Chapter1Application。
  • src/main/resources下的配置文件:application.properties。
  • src/test/下的测试入口:Chapter1ApplicationTests。

3.3 pom.xml

这里我们重点关注 <dependencies> 标签,这里写明了我们引入的组件

<dependencies>
<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>
  • spring-boot-starter-web:Web模块
  • spring-boot-starter-test:测试模块,包括JUnit、Hamcrest、Mockito

3.4 使用 Spring MVC 实现一组对 User 对象的 RESTful API

RESTful API 设计如下:

请求类型 URL 功能
GET / 查询用户列表
POST / 创建User
GET /{id} 根据 url 中的 id 获取 user 信息
PUT /{id} 根据 id 更新用户信息
DELETE /{id} 根据 id 删除用户信息

注意:RESTful接口在设计的时候应该遵循标准的方法以及语义,这些语义包含了安全性和幂等性等方面的考量,例如GET和HEAD请求都是安全的, 无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次, 结果总是一样的,后面的请求并不会产生比第一次更多的影响。

下面列出了GET,DELETE,PUT和POST的典型用法:

GET

  • 安全且幂等
  • 获取表示
  • 变更时获取表示(缓存)

POST

  • 不安全且不幂等
  • 使用服务端管理的(自动产生)的实例号创建资源
  • 创建子资源
  • 部分更新资源
  • 如果没有被修改,则不过更新资源(乐观锁)

PUT

  • 不安全但幂等
  • 用客户端管理的实例号创建一个资源
  • 通过替换的方式更新资源
  • 如果未被修改,则更新资源(乐观锁)

DELETE

  • 不安全但幂等
  • 删除资源

用户Model类如下:

public class UserModel {
private Long id;
private String name;
private int age; // 省略 getter 和 setter
}

REST API 实现类如下:

@RestController
public class UserController { // 创建线程安全的Map,用作数据存储
static Map<Long, UserModel> users = new ConcurrentHashMap<>(); /**
* 查询用户列表
* @return
*/
@GetMapping("/")
public List<UserModel> getUserList() {
List<UserModel> list = new ArrayList<UserModel>(users.values());
return list;
} /**
* 创建User
* @param userModel
* @return
*/
@PostMapping("/")
public UserModel postUser(@ModelAttribute UserModel userModel) {
users.put(userModel.getId(), userModel);
return users.get(userModel.getId());
} /**
* {id} 根据 url 中的 id 获取 user 信息
* url中的id可通过@PathVariable绑定到函数的参数中
* @param id
* @return
*/
@GetMapping("/{id}")
public UserModel getUser(@PathVariable Long id) {
return users.get(id);
} /**
* 根据 id 更新用户信息
* @param id
* @param userModel
* @return
*/
@PutMapping("/{id}")
public UserModel putUser(@PathVariable Long id, @ModelAttribute UserModel userModel) {
UserModel u = users.get(id);
u.setName(userModel.getName());
u.setAge(userModel.getAge());
users.put(id, u);
return users.get(userModel.getId());
} /**
* 根据 id 删除用户信息
* @param id
* @return
*/
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable Long id) {
users.remove(id);
return "success";
}
}
  • @Controller:修饰class,用来创建处理http请求的对象
  • @RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。

可以看一下 @RestController ,可以看到 @RestController 本身就是由 @ResponseBody@Controller 组成的,源码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController { /**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default ""; }

单元测试类如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootQuickStartApplicationTests { private MockMvc mvc; @Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
} @Test
public void contextLoads() throws Exception {
RequestBuilder request = null; // 1、get查一下user列表,应该为空
request = MockMvcRequestBuilders.get("/")
.contentType(MediaType.APPLICATION_JSON);
mvc.perform(request)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn(); // 2、post提交一个user
request = MockMvcRequestBuilders.post("/")
.param("id", "1")
.param("name", "Spring Boot")
.param("age", "18")
.contentType(MediaType.APPLICATION_JSON);
mvc.perform(request)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn(); // 3、get获取user列表,应该有刚才插入的数据
request = MockMvcRequestBuilders.get("/")
.contentType(MediaType.APPLICATION_JSON);
mvc.perform(request)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn(); // 4、put修改id为1的user
request = MockMvcRequestBuilders.put("/1")
.param("name", "Spring Boot Test")
.contentType(MediaType.APPLICATION_JSON); mvc.perform(request)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn(); // 5、get一个id为1的user
request = MockMvcRequestBuilders.get("/1")
.contentType(MediaType.APPLICATION_JSON); mvc.perform(request)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn(); // 6、del删除id为1的user
request = MockMvcRequestBuilders.delete("/1")
.contentType(MediaType.APPLICATION_JSON); mvc.perform(request)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn(); // 7、get查一下user列表,应该为空 request = MockMvcRequestBuilders.get("/")
.contentType(MediaType.APPLICATION_JSON); mvc.perform(request)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn(); } }

启动测试类,控制台打印如下,这里仅截取一段内容做展示:

MockHttpServletRequest:
HTTP Method = POST
Request URI = /
Parameters = {id=[1], name=[Spring Boot], age=[18]}
Headers = [Content-Type:"application/json"]
Body = <no character encoding set>
Session Attrs = {} Handler:
Type = com.springboot.springbootquickstart.controller.UserController
Method = public com.springboot.springbootquickstart.model.UserModel com.springboot.springbootquickstart.controller.UserController.postUser(com.springboot.springbootquickstart.model.UserModel) Async:
Async started = false
Async result = null Resolved Exception:
Type = null ModelAndView:
View name = null
View = null
Model = null FlashMap:
Attributes = null MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Type:"application/json;charset=UTF-8"]
Content type = application/json;charset=UTF-8
Body = {"id":1,"name":"Spring Boot","age":18}
Forwarded URL = null
Redirected URL = null
Cookies = []

从控制台打印中可以完整的看到整个模拟请求的过程以及参数。

示例代码-Github

示例代码-Gitee

4. 参考

《Spring Boot(一):入门篇》

《Spring Boot构建RESTful API与单元测试》

Spring Boot(一):快速开始的更多相关文章

  1. Spring Boot:快速入门教程

    什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...

  2. Spring Boot【快速入门】简单案例

    Spring Boot[快速入门]   Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point ...

  3. Spring Boot中快速操作Mongodb

    Spring Boot中快速操作Mongodb 在Spring Boot中集成Mongodb非常简单,只需要加入Mongodb的Starter包即可,代码如下: <dependency> ...

  4. Spring Boot框架——快速入门

    Spring Boot是Spring 全家桶非常重要的一个模块,通过 Spring Boot 可以快速搭建一个基于 Spring 的 Java 应用程序,Spring Boot 对常用的第三方库提供了 ...

  5. Spring Boot 如何快速集成 Redis 哨兵?

    上一篇:Spring Boot 如何快速集成 Redis? 前面的分享栈长介绍了如何使用 Spring Boot 快速集成 Redis,上一篇是单机版,也有粉丝留言说有没有 Redis Sentine ...

  6. IDEA下Spring Boot的快速搭建

    下边使用的是IDEA快速搭建一个Spring Boot项目 (1)File--New-New Project (2)点击Next填写相应的信息 (3)点击Next,选择Dependencies,这里创 ...

  7. Spring Boot【快速入门】

    Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for building all Sp ...

  8. Spring Boot入门-快速搭建web项目

    Spring Boot 概述: Spring Boot makes it easy to create stand-alone, production-grade Spring based Appli ...

  9. Spring Boot:快速入门

    上一篇讲述什么是Spring Boot,这一篇讲解怎么使用IDE工具快速搭建起来独立项目. 一.构建方式 快速搭建项目有三种方式,官方也有答案给到我们: 二.构建前准备 想要使用IDE运行起来自己的S ...

  10. Spring Boot的快速创建

    一.利用向导快速搭建Spring Boot应用 创建一个controller package com.hoje.springboot.Controller; import org.springfram ...

随机推荐

  1. XML简单了解一下

    XML是一种纯文本文档.HTML,标记是已经被W3C规定好的,自己创建一个标签是不被允许的. XML现在的用途是用来存储数据.config文件就是个XML文档.XML是可以自定义的. 每一个XML文档 ...

  2. 物流运输trans「ZJOI2006」

    [题目描述] 物流公司要把一批货物从码头\(A\)运到码头\(B\).由于货物量比较大,需要\(n\)天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运 ...

  3. Vue cli2.0 项目中使用Monaco Editor编辑器

    monaco-editor 是微软出的一条开源web在线编辑器支持多种语言,代码高亮,代码提示等功能,与Visual Studio Code 功能几乎相同. 在项目中可能会用带代码编辑功能,或者展示代 ...

  4. vue 使用gojs绘制简单的流程图

    在vue项目中需要展示工作流进度,可以使用的流程图插件很多 flowchart.js  http://adrai.github.io/flowchart.js/ , 基于SVG创建Flow Chart ...

  5. serverless在微店node领域的探索应用

    背景 目前微店中台团队为了满足公司大部分产品.运营以及部分后端开发人员的尝鲜和试错的需求,提供了一套基于图形化搭建的服务端接口交付方案,利用该方案及提供的系统可生成一副包含运行时环境定义可立即运行的工 ...

  6. Docker进阶-容器监控cAdvisor+InfluxDB+Granfana

    概述 前面文章介绍使用docker compose组合应用并利用scale快速对容器进行扩容. 由于docker compose启动的服务都在同一台宿主机上,对于一个宿主机上运行多个容器应用时,容器的 ...

  7. 登录cookies

    cookie Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话./p> cookie ...

  8. 线上ZK问题排查

    问题描述 测试环境ZK集群的三个节点中zk1状态虽然是follower,启动也能正常启动(通过telnet也能telnet 2181端口); 无法通过zk客户端去连接2181端口,状态一致是CONNE ...

  9. SSH开发模式——Struts2(第二小节)

    上一小节已经学会了如何去搭建Struts2的开发环境,该篇博客我们继续深入Struts2,了解Struts2框架的拦截器. 首先对我们在web.xml文件配置的过滤器进行一个源码的分析. 在Strut ...

  10. tf.name_scope() 和 tf.variable_scope() 的用法和玄机

    https://my.oschina.net/liusicong/blog/1593467