注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别。

前言

由于 J2EE 的开发变得笨重,繁多的配置,错乱的依赖管理,低下的开发效率,复杂的部署流程,第三方技术的集成难度较大等。同时随着复杂项目的演进,微服务分布式架构思想逐渐进入开发者的视野。

1. Spring Boot 介绍

Spring Boot 提供了一组工具只需要极少的配置就可以快速的构建并启动基于 Spring 的应用程序。解决了传统 Spring 开发需要配置大量配置文件的痛点,同时 Spring Boot 对于第三方库设置了合理的默认值,可以快速的构建起应用程序。当然 Spring Boot 也可以轻松的自定义各种配置,无论是在开发的初始阶段还是投入生成的后期阶段。

2. Spring Boot 优点

  • 快速的创建可以独立运行的 Spring 项目以及与主流框架的集成。
  • 使用嵌入式的 Servlet 容器,用于不需要打成war包。
  • 使用很多的启动器(Starters)自动依赖与版本控制。
  • 大量的自动化配置,简化了开发,当然,我们也可以修改默认值。
  • 不需要配置 XML 文件,无代码生成,开箱即用。
  • 准生产环境的运行时应用监控。
  • 与云计算的天然集成。

3. Spring Boot 前置

说了那么多的 Spring Boot 的好处,那么使用 Spring Boot 需要哪些前置知识呢?我简单列举了一下。

  • Spring 框架的使用。
  • Maven 构建工具的使用。
  • IDEA 或其他开发工具的使用。

4. Spring Boot 体验

现在我们已经了解了 Spring Boot 是什么,下面我们将使用 Spring Boot 开发一个入门案例,来体验 Spring Boot 开发姿势是如何的优雅与迅速。

Spring Boot 官方已经为我们如何快速启动 Spring Boot 应用程序提供了多种方式。

你可以在 Spring 官方网站直接生成项目下载导入IDE进行开发。

https://start.spring.io/

也可以直接克隆 GitHub 上的初始项目进行体验。

git clone https://github.com/spring-guides/gs-spring-boot.git
cd gs-spring-boot/initial

这里我们选择后者,直接克隆进入到 initial 文件夹使用 maven 进行编译启动。

 mvn package && java -jar target/gs-spring-boot-0.1.0.jar

第一次编译需要下载需要的依赖,耗时会比较长,编译完成之后紧接着可以看到 Spring 的启动标志。这时 Spring Boot 的 web程序已经运行在8080端口了。

$ curl -s localhost:8080
Greetings from Spring Boot!

5. Spring Boot 开发

下面手动编写一个 Spring Boot 入门案例,快速的开发一个 web mvc 应用。

项目结构如下:

5.1 依赖项


<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <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> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

spring-boot-starter-parent 是Spring Boot 的核心依赖,它里面定义了各种在开发中会用到的第三方 jar 的版本信息,因此我们在引入其他的 Spring Boot 为我们封装的启动器的时候都不在需要指定版本信息。如果我们需要自定义版本信息,可以直接覆盖版本属性值即可。

spring-boot-starter-web 提供 web 以及 MVC 和 validator 等web开发框架的支持。

spring-boot-starter-test 提供测试模块的支持。如 Junit,Mockito。

需要说明的是,Spring Boot 为我们提供了很多的已经封装好的称为启动器(starter)的依赖项。让我们在使用的时候不需要再进行复杂的配置就可以迅速的进行应用集成。所有的官方启动器依赖可以在这里查看。

所有官方发布的启动器都遵循类似的命名模式; spring-boot-starter-*,这里*是指特定类型的应用程序。此命名结构旨在帮助您寻找启动器。

注意:编写自己的启动器的时候不应该使用这种命名方式。

5.2 启动类

@SpringBootApplication
public class HelloApplication { public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
} @Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
// 开始检查spring boot 提供的 beans
System.out.println("Let's inspect the beans provided by Spring Boot:");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println(beanName);
}
};
}
}

@SpringBootApplication 注解是一个便利的注解,它包含了以下几个注解。

  1. @Configuration 定义配置类。

  2. @EnableAutoConfiguration 开启自动配置。

  3. @EnableWebMvc 标记为 web应用程序。

  4. @ComponentScan 组件扫描。

5.3 控制器

@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot!";
}
}

@RestController@Controller@ResponseBody 的结合体。

5.4 访问测试

直接启动 HelloApplication.java 类就可以在控制台看到启动输出,然后访问8080端口查看启动是否正常。

经过上面的例子,已经使用 Spring Boot 快速的创建了一个 web 应用并进行了简单的访问测试。

6. Spring Boot 单元测试

结合上面提到的 Spring Boot 启动器知识,Spring Boot 已经为我们提供了丰富的第三方框架,测试框架也不例外。

导入单元测试依赖。

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

6.1 模拟请求测试

编写单元测试

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /**
* 单元测试
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloApplicationTests { @Autowired
private MockMvc mvc; @Test
public void contextLoads() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string("Greetings from Spring Boot!"));
} }

关于上面代码的一些说明。

  • MockMvc 允许我们方便的发送 HTTP 请求。
  • SpringBootTest 方便的创建一个 Spring Boot 项目的测试程序。

运行没有任何异常说明程序测试通过。

6.2 Spring Boot 集成测试


import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner; import java.net.URL; /**
* <p>
* 嵌入式服务器由随机端口启动webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
* 并且在运行时发现实际端口@LocalServerPort
*
* @Author niujinpeng
* @Date 2018/12/4 15:02
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloApplicationTestBySpringBoot { @LocalServerPort
private int port; private URL base; @Autowired
private TestRestTemplate template; @Before
public void setup() throws Exception {
this.base = new URL("http://localhost:" + port + "/");
} @Test
public void getHello() throws Exception {
ResponseEntity<String> response = template.getForEntity(base.toString(), String.class);
assert (response.getBody().equals("Greetings from Spring Boot!"));
} }

嵌入式服务器由随机端口启动 webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT

并且在运行时使用注解 @LocalServerPort 发现实际端口。

运行测试类通过输出。

2018-12-06 22:28:01.914  INFO 14320 --- [o-auto-1-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2018-12-06 22:28:01.914 INFO 14320 --- [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2018-12-06 22:28:01.937 INFO 14320 --- [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 23 ms

文章代码已经上传到 GitHub Spring Boot 入门案例

<完>

本文原发于个人博客:https://www.codingme.net 转载请注明出处

Springboot 系列(一)Spring Boot 入门篇的更多相关文章

  1. Spring boot学习1 构建微服务:Spring boot 入门篇

    Spring boot学习1 构建微服务: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入门篇,helloworld案例演示

    为什么用spring boot? 嵌入的 Tomcat,无需部署 WAR 文件 简化 Maven 配置 无需 XML 配置,轻松快速地搭建Spring Web应用 开始学习SpringBoot 构建简 ...

  4. Spring Boot入门篇(基于Spring Boot 2.0系列)

    1:概述: Spring Boot是用来简化Spring应用的初始化开发过程. 2:特性: 创建独立的应用(jar|war形式); 需要用到spring-boot-maven-plugin插件 直接嵌 ...

  5. SpringBoot系列:Spring Boot使用模板引擎FreeMarker

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...

  6. SpringBoot系列:Spring Boot使用模板引擎Thymeleaf

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...

  7. SpringBoot系列:Spring Boot使用模板引擎JSP

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...

  8. Spring boot 入门篇

    详见:https://www.cnblogs.com/ityouknow/p/5662753.html 什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架, ...

  9. 构建微服务:Spring boot 入门篇

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

随机推荐

  1. IIS7配置伪静态把后缀名映射为html

    1.在IIS新建站点.[ 创建的时候不用去选择版本和模式,默认即可 ] 2.选中站点,切换到功能试图,找到“处理程序映射",双击之后,在打开窗口右侧的操作栏目下做如下设置: 1) 右边&qu ...

  2. 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

    之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...

  3. 浅谈C++ STL

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...

  4. [LeetCode] Score After Flipping Matrix 翻转矩阵后的分数

    We have a two dimensional matrix A where each value is 0 or 1. A move consists of choosing any row o ...

  5. extremecomponents

    具体教程: http://www.cnblogs.com/QQParadise/articles/1488920.html 教程中涉及到springmvc的相关知识 下载地址:http://sourc ...

  6. 在C++中,setw(int n)

    setw(int n)用来控制输出间隔例如:cout<<'s'<<setw(8)<<'a'<<endl;则在屏幕显示s        a //s与a之间 ...

  7. 关于HTTP协议,这一篇就够了

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  8. Dubbo+zookeeper构建高可用分布式集群(二)-集群部署

    在Dubbo+zookeeper构建高可用分布式集群(一)-单机部署中我们讲了如何单机部署.但没有将如何配置微服务.下面分别介绍单机与集群微服务如何配置注册中心. Zookeeper单机配置:方式一. ...

  9. [Swift]LeetCode412. Fizz Buzz

    Write a program that outputs the string representation of numbers from 1 to n. But for multiples of ...

  10. jupyter-notebook后home页面空白问题

    jupyter-notebook后home页面空白问题 解决方案1   更换默认的浏览器,选择谷歌浏览器,很多360打不开的页面,更换谷歌后都能有效解决,并且确保是最新版本的google浏览器. 解决 ...