第一个Spring Boot项目

Posted 陈小房

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一个Spring Boot项目相关的知识,希望对你有一定的参考价值。

开发工具选择

 

工欲善其事必先利其器,我们进行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 

	@Test
	void contextLoads() 
	

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

	@Test
	public 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 
    @Autowired
    private HelloService helloService;

    @Test
    public 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 
    @Autowired
    private MockMvc mockMvc;

    @Test
    public   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 入门

以上是关于第一个Spring Boot项目的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot学习——第一个Spring Boot程序

第一个spring-boot项目

Spring Boot第一个程序

我的第一个spring boot程序(spring boot 学习笔记之二)

Eclipse创建第一个Spring Boot项目

第一个Spring Boot项目