首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >快速实战 Spring Boot

快速实战 Spring Boot

作者头像
CSDN技术头条
发布于 2018-07-30 03:41:06
发布于 2018-07-30 03:41:06
67900
代码可运行
举报
文章被收录于专栏:CSDN技术头条CSDN技术头条
运行总次数:0
代码可运行

来源 | 快速学习 Spring Boot 技术栈

作者 | 张强(纯洁的微笑)

什么是 Spring Boot?

Spring 在官方首页这样介绍:

BUILD ANYTHING . Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring. Spring Boot takes an opinionated view of building production ready applications.

解释一下:Spring Boot 可以构建一切。Spring Boot 设计之初就是为了最少的配置,最快的速度来启动和运行 Spring 项目。Spring Boot 使用特定的配置来构建生产就绪型的项目。

使用 Spring Boot 有什么好处

其实就是简单、快速、方便!如果搭建一个 Spring Web 项目的时候需要怎么做呢?

  • 配置 web.xml,加载 Spring 和 Spring MVC
  • 配置数据库连接、配置 Spring 事务
  • 加载配置文件的读取,开启注解
  • 配置日志文件
  • 配置完成之后部署 Tomcat 调试

现在非常流行微服务,如果我这个项目仅仅只是需要发送一个邮件,如果我的项目仅仅是生产一个积分;我都需要这样折腾一遍!

但是如果使用 Spring Boot 呢?很简单,仅仅只需要三步就可以快速的搭建起一个 Web 项目!

使用 Spring Boot 到底有多爽,用下面这幅图来表达:

快速入门

说了那么多,手痒痒的很,马上来一发试试!

构建项目

(1)访问 http://start.spring.io/。

(2)选择构建工具 Maven Project、Spring Boot 版本 1.5.8 及一些工程基本信息,可参考下图:

(3)单击 Generate Project 按钮并下载项目压缩包。

(4)解压后,单击 Eclipse,Import | Existing Maven Projects | Next | 选择解压后的文件夹 | Finsh 命令,OK Done!

(5)如果使用的是 Idea,单击 File | New | Model from Existing Source.. | 选择解压后的文件夹 | OK 命令, 选择 Maven ,一路 Next,OK Done!

如果读者使用的是 Idea 工具,也可以这样:

(1)单击 File | New | Project… 命令,弹出新建项目框。

(2)选择 Spring Initializr 选项,单击 Next 按钮,也会出现上述类似的配置界面,Idea 帮我们做了集成。

(3)填写相关内容后,单击 Next 按钮,选择依赖的包再单击 Next 按钮,最后确定信息无误单击 Finish 按钮。

对上面的配置做一个解释:

  • 第一个选择框选择创建以 Maven 构建项目,还是以 Gradle 构建项目,这是两种不同的构建方式,其中 Gradel 配置内容更简洁一些,并且包含了 Maven 的使用,不过日常使用 Maven 居多。
  • 第二个选择框选择编程语言,现在支持 JavaKotlin 和 Groovy。
  • 第三个选择框选择 Spring Boot 版本,可以看出 Spring Boot 2.0 已经到了第五个里程碑了。在实际使用中,我们会优先使用稳定版本,1.0 的最新稳定版本是 1.5.8,也是我们演示使用的版本。

下面就是项目的配置信息了。

  • Group:一般填写公司域名,比如百度公司填 com.baidu,演示使用 com.neo。
  • Artifact:可以理解为项目的名称,可以根据实际情况来填,本次演示填写 helloWorld。
  • Dependencies:在这块添加我们项目所依赖的 Spring Boot 组件,可以多选。本次选择 Web、devtools 两个模块。
项目结构介绍

如上图所示,Spring Boot 的基础结构共三个文件:

  • src/main/java:程序开发以及主程序入口
  • src/main/resources:配置文件
  • src/test/java:测试程序

另外,Sping Boot 建议的目录结果如下:

root package 结构:com.example.myproject

com.example.myproject 目录下:

  • Application.java:建议放到根目录下面,是项目的启动类,Spring Boot 项目只能有一个 main() 方法。
  • comm:目录建议放置公共的类,如全局的配置文件、工具类等。
  • domain:目录主要用于实体(Entity)与数据访问层(Repository)。
  • repository:数据库访问层代码。
  • service:该层主要是业务类代码。
  • web:该层负责页面访问控制。

resources 目录下:

  • static:目录存放 Web 访问的静态资源,如 JS、CSS、图片等。
  • templates:目录存放页面模板。
  • application.properties:项目的配置信息。

test 目录存放单元测试的代码;pom.xml 用于配置项目依赖包,以及其他配置。

采用默认配置可以省去很多设置,当然也可以根据自己的喜好来进行更改。最后,启动 Application main 方法,至此一个 Java 项目搭建好了!

简单 Web 开发

(1)可以在 Spring Initializr 上面添加,也可以手动在 pom.xml 中添加:

pom.xml 文件中默认有两个模块:

  • spring-boot-starter:核心模块,包括自动配置支持、日志和 YAML;
  • spring-boot-starter-test:测试模块,包括 JUnit、Hamcrest、Mockito。

(2)编写 controller 内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestControllerpublic class HelloWorldController 

{    @RequestMapping("/hello")    
       public String hello() 
         {        
               return "Hello World";
      }
}

@RestController 的意思就是 controller 里面的方法都以 json 格式输出,不用再配置什么 jackjson 的了!

如果配置为@Controller 就代表着输出为页面内容。

(3)启动主程序,打开浏览器访问 http://localhost:8080/hello,就可以看到以下内容,是不是很简单!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Hello World

(4)如果我们想传入参数怎么办?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestControllerpublic class HelloWorldController 
{    @RequestMapping("/hello")    
       public String index(String name) 
           {        
               return "Hello World, " +name;
        }
}

重新启动项目,访问 http://localhost:8080/hello?name=neo,返回内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Hello World,neo

经过上一个测试发现,修改 controller 内相关代码,就需要重新启动项目才能生效,这样做很麻烦是不是,别着急。Spring Boot 提供了另外一个组件来解决。

热部署

热启动就需要用到我们在一开始引入的另外一个组件:devtools。它是 Spring Boot 提供的一组开发工具包,其中就包含我们需要的热部署功能。但是在使用这个功能之前还需要再做一些配置。

(1)在 dependency 中添加 optional 属性,并设置为 true:

(2)在 plugin 中配置另外一个属性 fork,并且配置为 true:

OK,以上两步配置完成,如果读者使用的是 Eclipse,那么恭喜你大功告成了。

如果读者使用的是 Idea 还需要做以下配置。

(3)配置 Idea

选择 File-Settings-Compiler 勾选 Build project automatically,低版本 Idea 勾选 make project automatically

使用快捷键:CTRL + SHIFT + A 输入Registry 找到选项 compile.automake.allow.when.app.running 勾选

全部配置完成后,Idea 就支持热部署了,大家可以试着去改动一下代码就会发现 Spring Boot 会自动重新加载,再也不需要我们手动点击重新部署了。

为什么 Idea 需要多配置后面这一步呢,因为 Idea 默认不是自动编译的,需要我们手动去配置后才会自动编译,而热部署依赖于项目的自动编译功能。

该模块在完整的打包环境下运行的时候会被禁用。如果使用 java -jar 启动应用或者用一个特定的 classloader 启动,它会认为这是一个“生产环境”。

单元测试

单元测试在日常开发中是必不可少的,一个牛逼的程序员,单元测试写得也是杠杠的。下面来看下 Spring Boot 对单元测试又做了哪些支持?

如果我们只想运行一个 hello World,只需要一个注解就可以。在 src/test 目录下新建一个 HelloTests 类,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HelloTest 
{
   @Test    public void hello()
       {
       System.out.println("hello world");
     }
}

单击右键“运行”按钮,会发现控制台输出:hello world。仅仅只需要了一个注解。但是如果我们需要测试 web 层的请求呢?Spring Boot 也给出了支持。

以往我们在测试 web 请求的时候,需要手动输入相关参数在页面测试查看效果,或者自己写 post 请求。在 Spring Boot 中,Spring 给出了一个简单的解决方案;使用 mockmvc 进行 web 测试,mockmvc 内置了很多工具类和方法,可以模拟 post、get 请求,并且判断返回的结果是否正确等,也可以利用print()打印执行结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootTest 
public class HelloTest 
{    
     private MockMvc mockMvc;
    @Before   
    public void setUp() t
           hrows Exception 
            {
          mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
           }
        @Test   public void getHello() 
       throws Exception 
              {
       mockMvc.perform(MockMvcRequestBuilders.post("/hello?name=小明").accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());
            }
}

在类的上面添加@SpringBootTest,系统会自动加载 Spring Boot 容器。在日常测试中,我们就可以注入 bean 来做一些局部业务的测试。MockMvcRequestBuilders可以 post、get 请求,使用print()方法会将请求和相应的过程都打印出来,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MockHttpServletRequest:
     HTTP Method = POST
     Request URI = /hello
      Parameters = {name=[neo]}
         Headers = {}
Handler:
       Type = com.neo.helloWorld.web.HelloWorldController
       Method = public java.lang.String com.neo.helloWorld.web.HelloWorldController.hello(java.lang.String)
...
MockHttpServletResponse:
          Status = 200   
          Error message = null
          Headers = {Content-Type=[text/plain;charset=ISO-8859-1], Content-Length=[16]}
          Content type = text/plain;
          charset=ISO-8859-1           
          Body = Hello World ,neo
          Forwarded URL = null  
          Redirected URL = null         
          Cookies = []

从返回的Body = Hello World ,neo可以看出请求成功。

总结

使用 Spring Boot 可以非常方便、快速搭建项目,而不用关心框架之间的兼容性、适用版本等各种问题,我们想使用任何东西,仅仅添加一个配置就可以,所以使用 Sping Boot 非常适合构建微服务。

建议大家使用 Idea 开发 Spring Boot 项目,Eclipse 对 Spring Boot 项目支持并不好,并且使用 Eclipse 偶尔会出现一些诡异的问题,影响初学者的学习。

《快速学习 Spring Boot 技术栈》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GitChat精品课 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 1803. Count Pairs With XOR in a Range (二叉树)
题目 在一个数组里面找到两个数异或的结果在某个范围之内。 这种题目,就要用二叉树, 代码写的又臭又长。。 struct Node { int value; int left; int right; int num; int pos; }tree[200005]; class Solution { public: int hight; int lower; int fun(int root, int number, int h, int l, int pos) { if(pos==
ShenduCC
2021/06/22
3430
LeetCode(Weekly Contest 187)题解
0. 前言 这周五一小长假,祝大家节日愉快  中文版地址:https://leetcode-cn.com/contest/weekly-contest-187/ 英文版地址:https://leetcode.com/contest/weekly-contest-187/ 1. 题解 1.1 5400. 旅行终点站(1436. Destination City) 中文版题目描述:https://leetcode-cn.com/problems/destination-city/ 英文版题目描述:htt
西凉风雷
2022/11/23
3020
LeetCode Contest 166
但是在用c++的快排的时候,被坑了,我一直的习惯是写自定义比较函数,没有写运算符重载,不知道为什么一直RE,浪费了挺多时间
ShenduCC
2019/12/11
3170
超超超高频面试题,快来混个脸熟(二)
这套题是某大厂为在校生举办的活动,据说是大厂高频面试原题,我代大家刷一刷,给大家伙混个脸熟
ACM算法日常
2021/09/28
4500
LeetCode Weekly Contest 47解题思路
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/77648468
用户1147447
2019/05/26
4090
LeetCode Contest 181
遍历除数的时候从1到sqrt(nums[i]) 10000*sqrt(100000) 是不会超时的
ShenduCC
2020/03/23
3340
LeetCode Weekly Contest 281
让你算出一个数组有多少对数字的乘积能被K整除。我们可以对数组中的每个数a[i], 来算a[i+1] - a[n]中有多少个数字和它的乘积是能被k整除的。 如果我们可以知道 最小的x,是的 x*a[i]能被k整除,那么a[i+1]-a[n]中的每个能整除x的数都是我们要找的数。 那么这个最小的x怎么算呢,其实是k/gcd(k, a[i]), 所以我们事先要对k分解因数,然后把数组中能整除这些因数的元素的个数事先存好。 然后针对每个元素a[i],计算x,再计算a[i+1]-a[n]中能整除x的元素个数
ShenduCC
2022/03/10
2890
LeetCode Weekly Contest 36解题思路
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/72957261
用户1147447
2019/05/26
3780
LeetCode Weekly Contest 40解题思路
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/75222189
用户1147447
2019/05/26
4550
LeetCode Contest 177
给你一些点和边,判断是否是一颗二叉树。只需要判断所有点的入度<=1 ,并且入度为0的点只有一个,就可以了。
ShenduCC
2020/02/25
3020
LeetCode Weekly Contest 38解题思路
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/73718744
用户1147447
2019/05/26
4520
LeetCode Weekly Contest 29解题思路
代码很简单,简单说明下思路就出来了。按照题意,不管怎么二分,整个数组都会被划分成两部分和,这两部分和必然一大一小。如nums = [1,4,3,2],划分如下[1,2],[3,4],它们的和分别为3和7。现在我们考虑【小和】的情况,因为题目说了min(ai, bi),所以划分时,我们总是取较小的元素为一个集合,那么带来的结果必然是sum(xi), i = 1 to n, xi = min(ai,bi)较小,现在要让这部分的和最小,那么自然在划分两部分时,让两边的和尽可能相等。这就说明了一点,每当选取两个元素时,应该让它们尽可能的【靠近】,这样小和能尽量接近大和。
用户1147447
2019/05/26
3990
LeetCode Weekly Contest 34解题思路
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/72812515
用户1147447
2019/05/26
3560
LeetCode Weekly Contest 44解题思路
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/77019115
用户1147447
2019/05/26
4490
LeetCode(Weekly Contest 190)题解
0. 前言 中文版地址:https://leetcode-cn.com/contest/weekly-contest-190/ 英文版地址:https://leetcode.com/contest/weekly-contest-190/ 1. 题解 1.1 5416. 检查单词是否为句中其他单词的前缀(1455. Check If a Word Occurs As a Prefix of Any Word in a Sentence) 中文版题目描述:https://leetcode-cn.com/p
西凉风雷
2022/11/23
2580
LeetCode笔记:Weekly Contest 278
这一题的思路就是用两个数组分别来保存没有个idx左侧0的总数和右侧1的总数,然后就可以快速地给出答案了。
codename_cys
2022/04/13
2250
LeetCode Weekly Contest 37解题思路
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/73431186
用户1147447
2019/05/26
4350
数字问题-LeetCode 524、525、526、528、530、537、539、540
LeetCode # 524 525 526 528 530 537 539 540
算法工程师之路
2020/02/13
5230
LeetCode 297. Serialize and Deserialize Binary Tree
题目 树的序列化, /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Codec { public: string find(string
ShenduCC
2020/05/29
5050
LeetCode笔记:Weekly Contest 320
这一题我的思路非常暴力,就是一个三重循环,找到三个unique的元素之后看一下他们各自有多少重复个数,然后相乘求和即可。
codename_cys
2022/11/28
4560
相关推荐
LeetCode 1803. Count Pairs With XOR in a Range (二叉树)
更多 >
交个朋友
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入[架构及运维] 腾讯云技术交流站
云架构设计 云运维最佳实践
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档