第2章 第一个Spring Boot项目

news/2024/5/18 23:57:32/文章来源:https://blog.csdn.net/qwdzq/article/details/126711333

开发工具选择

 

工欲善其事必先利其器,我们进行Java项目开发,选择一个好的集成开发工具(IDE)对提高我们的开发调试效率有非常大的帮助。这里我们选择大名鼎鼎的IDEA ,它全称 IntelliJ IDEA。

​IntelliJ IDEA公认最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析方面功能强大,尤其是其智能化人性化的辅助功能会让你用起来就爱不释手。IDEA是JetBrains公司的产品,我们可以在官网下载。Intellij IDEA有Community和Ultimate两个版本,Community为免费版,Ultimate为收费版,区别就是Ultimate可以开发web项目。

IntelliJ IDEA: IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrains

创建Spring Boot项目的2种方法

创建Spring Boot项目一般有两种方法,一种是使用Spring官网提供的在线项目生成向导生成,另一种是使用Intellij IDEA自带的Spring项目生成向导生成。在创建项目之前需要安装JDK,网上教程较多,这里就不再赘述了。

方法1:使用Spring 官网在线生成项目

访问https://start.spring.io/ 出现如下页面。在Project 中选择Maven Project,编程语言Language中选择Java,Spring Boot版本使用默认选项即可。 Project Metadata 中Group为组织机构,一般按com.组织机构名填写,这里我填写了com.cjl , 选项Artifact代表子项目名,Name代表具体项目名称这里我们填写helloworld,描述信息Description请随意填写,Package name会自动生成。填写完毕基本参数之后,点击Generate创建并下载项目压缩包

将下载下来的项目压缩包解压,其中文件目录如下

​使用IDEA导入项目,选择File->Open File or Project,选择前面我们解压后的文件夹,单击OK,这个时候IDEA会提示你使用新的窗口还是在当前窗口,可以根据实际情况选择,选择完毕之后,出现如下项目窗口,其中项目文件结构还未完全显示,同时IDEA右下方有一个小进度条,表面IDEA正在下载项目依赖文件

​当IDEA下载完相关依赖文件之后会出现类似如下的项目结构。具体不同目录和文件的含义我们稍后介绍。

方法2:IDEA自带的Spring项目生成向导生成

选择File->New->Project命令,弹出新建项目对话框。

​左侧选择Spring Initializr,Project SDK根据项目需要选择

选择完毕后点击Next,出现Project Metadata填写页面,参照方法1填写即可

​点击Next 出现和前述导入一样的画面,等待IDEA将依赖文件下载完毕,即可看到项目结构目录。至此项目的初始创建完成。接下来我们介绍一下Spring Boot项目的结构以及如何将其运行起来。

Spring Boot项目基本结构

了解项目的目录结构是理解整个Spring Boot项目的基础,同时对理解项目的部署、维护也很有帮助。Spring Boot的项目结构如下,下面我们对其进行说明

.idea目录,这个目录其实不属于Spring Boot项目,.idea目录是存储IntelliJ IDEA项目的配置信息,主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。

.mvn目录

​maven-wrapper主要有两个用处:

1.可以为某个Java工程指定特定Maven版本,避免因为Maven版本差异引起的环境错误统一项目的开发环境.

2.不再需要提前安装Maven,简化了开发环境的配置.

接下来的src目录是Spring Boot主目录

​其中

src/main/java: 是程序开发及主程序目录

src/main/resource: 存放配置文件和资源文件,例如一些项目中用到的图片、视频、音频等和项目配置文件application.properties

src/test/java: 是测试程序目录,我们在该目录下编写测试程序

接下来介绍一下其他文件

.gitignore文件 :Git忽略文件.gitignore,我们开发过程中会产生很多中间文件或者一些只有在本地使用的文件,这些文件不需要上传到代码库中,我们可以使用.gitignore进行配置。

pom.xml介绍

pom.xml文件是Maven项目中非常重要的配置文件。Gradle项目的配置文件是build.gradle,主要描述项目包的依赖和项目构建时的配置。由于pom.xml文件非常重要,我们对它进行详细介绍

pom.xml文件头信息

<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">
<modelVersion>4.0.0</modelVersion>
  • xmlns:命名空间,类似包名,因为xml的标签可自定义,为防止自定义的标签重名,需要命名空间来进行区分

  • xmlns:xsi :xml遵循的标签规范

  • xsi:schemaLocation :用来定义xmlschema的地址,也就是xml书写时需要遵循的语法

  • modelVersion:声明项目描述符遵循哪一个POM模型版本

项目基本信息

<groupId>com.cjl</groupId><artifactId>helloworld</artifactId><version>0.0.1-SNAPSHOT</version><name>helloworld</name><packaging>jar</packaging><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties>
上面的配置内容基本是创建项目时定义的有关项目的基本描述信息其中:
  • groupld:组织名也是项目的包路径。

  • artifactld: 项目名称。

  • version:项目版本号。

  • packaging:一般有jar、war两个值,表示使用Maven打包时是构建成JAR包还是WAR 包,默认是jar。

  • name:项目名称。

  • description:项目描述

项目依赖项信息

Spring Boot项目依赖项信息主要分为两部分parent和dependencies两部分。

parent部分

	<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.2</version><relativePath/> <!-- lookup parent from repository --></parent>
这部分是配置父级项目的信息,这是Spring Boot的主要优点之一,将需要的依赖项打包在父项目依赖中,Maven支持项目的父子结构,引入后会默认继承父级的配置。此项目中引入spring-boot-starter-parent定义Spring Boot的基础版本。

dependencies部分

	<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
dependencies:配置项目所需要的依赖包,其中每个dependency标签代表一个依赖项,groupId是该依赖项的公司或者组织的唯一标志,artifacId是某个项目的唯一ID,一个groupId下面可能多个项目。

项目公共属性

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties>
properties标签下定义了一些项目的公共属性,例如源程序文件编码格式,Java版本等等。

项目构建相关配置

	<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
build标签下面是项目构建相关配置信息,由于我们选择的是Maven构建Spring Boot项目,所以必须在<plugins>中添加spring-boot-maven-plugin插件,这样项目就能以Maven的方式为应用提供Spring Boot的支持。

运行第一个项目

好了,前面已经对项目结构、pom.xml文件已经做完了介绍,相信很多读者都迫不及待想把项目运行起来了。下面介绍一下,如何运行我们第一个hello world程序。

在src\main\java\com\cjl\helloworld\目录上右击,选择new pacage创建一个目录

然后在该目录下创建HelloController类,随后添加/helloworld的路由地址和方法,代码如下

package com.cjl.helloworld.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@RequestMapping("/helloworld")public String helloworld() {return "hello world,你好世界";}
}

在上面代码示例中,我们创建了一个HelloController并创建了一个helloworld()方法,最后使用

@RestController 和@RequestMapping 注解实现HTTP路由。

可能有些初学者对注解这个词比较陌生,这里简单介绍一下,注解和注释很像,两者其实本质就差不多,注释是给我们程序员看的,而注解呢其实就是给程序看的,某个注解可以告诉程序要做什么事情。例如这里的 @RestController 标识被它标记的这个Spring中的类HelloController可以接收HTTP请求并返回return中的数据,而@RequestMapping("/helloworld")则提供路由映射,即访问“项目地址XX/helloworld”路径的HTTP请求,都会映射到helloworld()方法上处理。

接下来我们开始运行项目,在左侧项目导航中选中HelloworldApplication文件,可以看到文件中有一个注解@SpringBootApplication表面这是我们Spring项目的入口文件,点击右侧的绿色小三角形箭头,然后选择Run

项目如果成功运行,在IDEA下侧的输出窗口会看到类似如下的输出,其中注意port(s):8080,这表明我们的项目在8080端口监听服务,这个接下来会使用到

成功运行项目之后,我们用地址http://localhost:8080/helloworld 访问项目,出现如下图信息,则说明我们的项目运行成功了

接下来要介绍一下Spring的单元测试,可能很多同学在学校期间编写代码没有做单元测试的习惯,但是在实际开发中,单元测试是一项非常重要的工作,养成良好的单元测试习惯,可以减少大量的bug,让你的项目更加顺利上线,为你节省大量精力。

Spring Boot作为一个专业的开发框架,它对单元测试的支持非常好,要使用单元测试功能,只需要在项目pom.xml文件中添加spring-boot-starter-test测试依赖启动器,然后就可以通过相关的单元测试注解实现单元测试。由于在线生成或者用IDEA生成向导生成的项目默认已经带了测试依赖启动器,无需再添加,如果没有需要在pom.xml中手动添加

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

确认项目中添加了测试依赖启动器之后,就可以开始编写对应的单元测试了

现在我们第一步只是单纯想运行一下单元测试,输出一句“Spring boot单元测试开始”,我们使用@Test 注解 实现。在自动生成的HelloworldApplicationTests类中已经有一个自动生成的单元测试方法实例了

@SpringBootTest
class HelloworldApplicationTests {@Testvoid contextLoads() {}}

@SpringBootTest 注解用于标记这是一个测试类,其作用是用于确定如何装载 Spring 应用程序的上下文资源,这样框架会自动将这段程序加载到Spring Boot容器中,@Test 说明这是一个单元测试用例。我们仿照示例编写自己的单元测试程序

	@Testpublic void  helloworld() {System.out.println("Spring boot单元测试开始");}
单机方法右侧的绿色箭头运行单元测试helloworld()方法,如果一切正常则会看到如下输出,左上角的绿色小勾说明测试通过,左下方会输出单测函数的输出结果

上面介绍了Spring Boot中最基本的单元测试,在一般开发过程中单元测试应用最多的地方是针对Service和Controller的测试。

测试Service方法

首先在项目中新建一个要测试的Service类,具体方法是。在com.cjl.helloworld目录下新建目录service,在目录中添加HelloService类。我们在该类中定义一个findHelloMsg()的方法,后面我们将测试该方法是否按预期运行

接下来就是生成对于的测试方法,对此IDEA提供了良好的支持,在Service类文件中右击,选择Go To,然后选择Test

随后会弹出如下创建向导,在其中勾选我们需要测试的方法

点击Ok后会在test目录下生成对于的测试类HelloServiceTest,并且其中已经生成了对findHelloMsg()的测试方法,我们在其中添加需要的代码

首先在class声明头部添加@RunWith(SpringRunner.class)注解,在编写代码过程中如果相应的类没有引入IDEA还会提示,我们按照提示操作即可

完整的测试代码如下,我们用@Autowired 注解了一个HelloService 类实例,以便后面测试时调用。然后编写了findHelloMsg()测试函数,里面用Assert.assertEquals方法判断findHelloMsg()运行结果是否符合我们预期

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import static org.junit.jupiter.api.Assertions.*;@RunWith(SpringRunner.class)
@SpringBootTest
class HelloServiceTest {@Autowiredprivate HelloService helloService;@Testpublic void findHelloMsg() {Assert.assertEquals("find Hello Msg", helloService.findHelloMsg());}
}
 

将鼠标放到单元测试方法findHelloMsg()上,右键选择Run执行该方法,我们即可看到运行结果

测试Controller

除了对Service进行测试,我们还需要对Controller进行测试。由于Controller功能是对不同的web请求进行路由响应因此需要一个可以模拟Web请求的类来辅助测试,这个类就是MockMvc类。MockMvc类能够模拟HTTP请求,来访问Controller中的方法,同时不依赖网络环境。spring-boot-starter-test中使用@WebMvcTest等注解进行使用。在我们前面创建的HelloController类里,按照前述方法创建测试用例程序

在IDEA自动生成的代码上添加代码如下

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
class HelloControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic   void helloworld() throws  Exception {mockMvc.perform(MockMvcRequestBuilders.post("/helloworld").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andDo(print());}
}
代码中使用MockMvc类实例mockMvc构造HTTP请求,通过MockMvcRequestBuilder.post构造一个post请求,通过contentType(MediaType.APPLICATION_JSON)设置返回格式为JSON格式,andExpect(status().isOk())对执行的结果进行判断,默认HTTP请求返回状态码200为正确,andDo(print())在执行完毕后调用print()将处理结果打印出来。

运行测试程序可以看到结果输出

在Idea的spring工程里,经常会遇到Could not autowire. No beans of 'xxxx' type found的错误提示。但程序的编译和运行都是没有问题的,这个错误提示并不会产生影响。 原因在于spring auto scan配置。在编辑情况下,无法找不到对应的bean,于是提示找不到对应bean的错误,只要修改工程的配置即可

​点击File->Settings 输入autoW然后按图修改即可

开发中的热部署

我们在调试开发Spring Boot项目过程中,经常需要反复修改测试,在修改之后往往需要重启服务,有些服务需要加装很长时间,这就导致了开发效率低下,为解决这个问题Spring Boot框架专门提供了进行热部署的依赖启动器,实现项目的热部署。

添加热部署依赖启动器

使用热部署需要添加相应的依赖启动器,在pom.xml中引入

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>
 

在IDE工具中设置热部署,点击File->Settings, 打开Compiler面板设置,选择【Build,Execution,Deployment】下的Comiller,选中自动编译项目Build project automatically

​在项目任意页面使用快捷键 "Ctrl+Shift+Alt+/"打开Maintenance选项框,选择Registry页面,然后选择运行自动编译运行

效果测试,启动项目访问http://localhost:8080/helloworld可以看到当前的输出是

然后我们修改helloworld的代码,返回值变为"hello world,我很好";

@RestController
public class HelloController {@RequestMapping("/helloworld")public String helloworld() {return "hello world,我很好";}
}

​我们观察输出窗口,发现项目自动进行编译并运行了,同时刷新浏览器,内容改变说明热部署生效。

项目源码

可以访问:GitHub - qwdzq/springboot: spring boot 入门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_5732.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生 | Kubernetes 系列】K8s 实战 如何给应用注入数据 II 将pod数据传递给容器

将pod数据传递给容器前言一、通过环境变量将 Pod 信息传递给容器1.1、用 Container 字段作为环境变量的值二、通过文件将 Pod 信息呈现给容器2.1、存储容器字段总结前言 在上一篇文章中&#xff0c;我们学习了针对容器设置启动时要执行的命令和参数、定义相互依赖的环境变量、为…

关于订单过期的监听和处理

订单过期监听和处理 业务需求 有些时候 用户发起订单 但是没有付款 这个时候一般来说 会设置一个订单过期时间 如果订单过期 则需要重新下单 问题来了 如果每过一段很小的时间就去盘一次数据库 那压力也太大了 demo 搭建 用到的 mysql mybatis plus redis rabbit mq 目录结…

【毕业设计】单片机远程wifi红外无接触体温测量系统 - 物联网 stm32

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理4.1 **MLX90614红外测温传感器**4.2 TOF10120激光测距传感器4.3 DS18B20传感器**DS18B20单总线协议**5 部分核心代码5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设…

精妙绝伦

精妙绝伦啊,精妙绝伦啊,大妙! 今天讨论到一个二级联动省和市在一个表中的情况, 这么一组数据,需要达成一个sql语句便能把省和市同时显示出来,愚绞尽脑汁思虑良久,未得有用之策,经同事提点,顿醍醐灌顶! 先来解释一下这串代码:Select * from TBSpace inner join TBPla…

three.js绘制地图(平面、曲面)

加载中国地图json数据 let loader = new THREE.FileLoader(); loader.load(model/chinaJson.json, function (data) {let jsonData = JSON.parse(data);initMap(jsonData); // 解析并绘制地图 });绘制曲面地图function initMap( chinaJson ) {//创建一个空对象存放对象map = ne…

Vue指令

Vue指令分为内置指令和自定义指令 内置指令 v-bind 单向绑定解析表达式&#xff0c; 简写&#xff1a; &#xff1a;xxx <div id"root">单项数据绑定&#xff1a;<input type"text" v-bind:value"name"><br></div> v…

2023秋招——快手数据研发一、二面面经

&#x1f33c;今天来总结一下快手数据研发的一、二面&#xff0c;在面试中进步&#xff0c;在总结中成长&#xff01;对往期内容感兴趣的小伙伴可以参考下面&#x1f447;&#xff1a; 链接: 2022暑期实习字节跳动数据研发面试经历-基础数仓.链接: 2022百度大数据开发工程师实…

three.js实现鼠标拾取例子

基本思路 <script> var renderer,scene,camera; var light; var raycaster,//相机->鼠标的射线mouse,//鼠标所在位置actionObject;//选中的物体 init(); animation();function init(){//渲染器//场景//相机//方向光//创建2000个立方体//创建射线//创建鼠标二维向量(圆…

epoll实现异步请求数据---以UDP为例

文章目录同步UDP请求数据的问题异步请求的模型具体的代码同步UDP请求数据的问题 不管是请求DNS资源还是其他资源。如果以串行的方式请求数据&#xff0c;也就是send以后recv阻塞等待获取数据&#xff0c;这样做的效率非常低效&#xff0c;网络延迟、服务器处理请求、再加上rec…

【C# 学习笔记 ②】C#基本语法(数组、判断和循环、字符串、枚举、结构体)

由于在自己的工作和学习过程中&#xff0c;只查看某个大佬的教程或文章无法满足自己的学习需求和解决遇到的问题&#xff0c;所以自己在追赶大佬们步伐的基础上&#xff0c;又自己总结、整理、汇总了一些资料&#xff0c;方便自己理解和后续回顾&#xff0c;同时也希望给大家带…

【我不熟悉的css】07. css命名,bem规范,跟着组件库element-ui学习组件命名

在去年&#xff0c;我总结了一篇文章&#xff0c;跟着element-ui学习css命名 【系统学习css】跟着element-ui学习css的命名_我有一棵树的博客-CSDN博客每日鸡汤&#xff0c;每一个你想要学习的念头都是未来的你向自己求救写css 最烦人的就是给class起名字了&#xff0c;这里不…

这一次,我们把AI自治数据库带到了世界人工智能大会上

9月3日,2022世界人工智能大会(WAIC)在上海圆满落幕。WAIC2022 秉持“智联世界”理念,通过线上线下联动的会展形式,汇聚顶级科学家、企业家、政府官员、专家学者、国际组织、投资人、创新团队一同探讨科技前沿话题,推动全球“共创、共建、共融、共治、共享、共赢”。WAIC …

【Python刷题篇】——Python入门 09 字典(上)

&#x1f935;‍♂️ 个人主页: 北极的三哈 个人主页 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;Python领域新星创作者。 &#x1f4d2; 系列专栏&#xff1a;《牛客题库-Python篇》 &#x1f310;推荐《牛客网》——找工作神器|笔试题库|面试经验|实习经验内推&am…

【数据结构与算法】之深入解析“乘法表中第K小的数”的求解思路与算法示例

一、题目要求 几乎每一个人都用乘法表,但是你能在乘法表中快速找到第 k 小的数字吗?乘法表是大小为 m x n 的一个整数矩阵,其中 mat[i][j] == i * j(下标从 1 开始)。给你三个整数 m、n 和 k,请你在大小为 m x n 的乘法表中,找出并返回第 k 小的数字。示例 1:输入:m =…

MATLAB | 全网唯一,三元相映射图绘制(三元相分级统计地图)

示例 对上期的补充 本期文章名叫三元相映射图绘制&#xff0c;但不单单讲这一点&#xff0c;同时会对上一篇多元映射地图做出补充https://slandarer.blog.csdn.net/article/details/126702967&#xff1a; 上篇中可以绘制这样的三变量映射地图&#xff1a; 但这只是对多边形…

Vue学习之--------路由(Router)的基本使用(1)(2022/9/5)

理解&#xff1a; 一个路由&#xff08;route&#xff09;就是一组映射关系&#xff08;key - value&#xff09;&#xff0c;多个路由需要路由器&#xff08;router&#xff09;进行管理。前端路由&#xff1a;key是路径&#xff0c;value是组件。控制页面的跳转 文章目录1、基…

01-linux基础命令

1、常用命令 常用Linux命令的基本使用序号命令对应英文作用01 ls list 查看当前目录下的内容02 pwd print working derectory 查看当前所在文件夹03 cd [目录名] change directory 切换文件夹04 touch [文件名] touch 如果文件不存在, 新建文件05 mkdir [目录名] make director…

【JavaSE】多线程篇(三)用户线程、守护线程与线程的7大状态

&#x1f481; 个人主页&#xff1a;黄小黄的博客主页 ❤️ 支持我&#xff1a;&#x1f44d; 点赞 &#x1f337; 收藏 &#x1f918;关注 &#x1f38f; 格言&#xff1a;All miracles start from sometime somewhere, make it right now. 本文来自专栏&#xff1a;JavaSE从入…

关于使用@Scheduled()注解造成的多任务冲突问题解决

问题描述&#xff1a; 2022-08-18 01:59:00.001 INFO [irms-transfer-service,,,] 15 --- [ scheduling-1] c.s.i.t.service.impl.ProjectManageSvc : -------定时扫描导出任务开启------- 2022-08-18 01:59:00.004 INFO [irms-transfer-service,,,] 15 --- [ schedu…

如何查看navicat已连接用户的密码

1:从注册表中查看加密后的密码。1.1:windows键+r,输入 regedit1.2:在注册表中找到 \HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\navicat\servers 并找到 UserName 即 账号1.3:从上面步骤中,打开注册表、并找到如下图片中的密码栏:Pwd(加密的密码)2:解密密码,打开在线工…