# springboot-task1 **Repository Path**: kirayous/springboot-task1 ## Basic Information - **Project Name**: springboot-task1 - **Description**: 实验一 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-03 - **Last Updated**: 2021-04-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 实验一 使用Spring Boot构建应用程序 ## 一、 实验目的 1、 掌握使用IntelliJ IDEA创建Spring Boot应用程序的方法; 2、 了解spring-boot-starter-parent的配置内容; 3、 掌握如何利用Starter扩展Spring Boot应用程序的功能; 4、 掌握如何配置Starter; 5、 掌握如何通过属性文件定制Spring Boot应用程序的初始化参数; 6、 掌握使用Spring Boot编写简单的单元测试; 7、 了解Spring Boot应用程序的Fat Jar文件; 8、 掌握Markdown轻量级标记语言编写README.md文件。 ## 二、 实验环境 1、 JDK 1.8或更高版本 2、 Maven 3.6+ 3、 IntelliJ IDEA ## 三、 实验任务 #### 1、 通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目; #### 2、 添加两个功能模块:spring MVC、lombok; ![输入图片说明](https://images.gitee.com/uploads/images/2021/0403/192420_61803af7_5631448.png "屏幕截图.png") #### 3、 添加阿里云镜像仓库作为项目maven仓库; ![输入图片说明](https://images.gitee.com/uploads/images/2021/0403/193627_b6b85c67_5631448.png "屏幕截图.png") #### 4、 解释项目pom.xml文件中主要标签的意义; ``` 4.0.0 org.springframework.boot spring-boot-starter-parent 2.4.4 com.kirayous.task task1 0.0.1-SNAPSHOT task1 www.funtl.com Demo project for Spring Boot 1.8 1.8 jar junit junit test true org.springframework.boot spring-boot-starter-web org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin org.projectlombok lombok ``` #### 5、 配置jetty或undertow作为Spring Boot应用程序的默认Servlet容器; tomcat:开源,SpringBoot默认,使用比较多 jetty:小Serlvet容器,适合做长链接,也就是链接上就不断,长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,很多人开发测试的时候很喜欢用, 因为它启动比 tomcat要快很多 undertow:是一个非阻塞的Servlet容器,但是它不支持JSP。 Spring Boot 默认使用Tomcat,一旦引入 spring-boot-starter-web 模块,就默认使用Tomcat容器。 所以需要再引用spring-boot-starter-web的依赖模块时,排除掉tomcat ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/090732_1b74967a_5631448.png "屏幕截图.png") 然后导入jetty依赖 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/090912_77ae8320_5631448.png "屏幕截图.png") 测试运行结果 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/091913_f67bf0f4_5631448.png "屏幕截图.png") #### 6、 配置Gson作为Spring Boot应用程序的默认JSON MessageConverter;(可选) JSON是目前主流的前后端数据传输格式,SpringBoot中默认使用Jackson作为JSON的处理器。Gson是Google开源的JSON格式化框架 整合Gson,在这之前需要在spring-boot-starter-web的依赖下除去默认的jackson-databind,然后再加入Gson的依赖。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/092452_e2c5fa3a_5631448.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/092536_ca6b2034_5631448.png "屏幕截图.png") 新建实体类 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/100915_9e1b53de_5631448.png "屏幕截图.png") 新建controller类,然后使用json对实体类进行json格式化(实际上RestController会自动将你返回的实体类进行json格式化) ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/101044_553241ee_5631448.png "屏幕截图.png") 输出结果 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/101110_9e7ff49f_5631448.png "屏幕截图.png") #### 7、 修改Spring Boot应用程序启动时的Banner;(新增-2020-10-5) 直接在recourses目录下加入自定义的banner.txt,springboot容器会默认替换掉原来的banner ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/101338_b3298094_5631448.png "屏幕截图.png") 启动结果 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/101643_4d174202_5631448.png "屏幕截图.png") #### 8、 添加一个简单的Spring Mvc控制器组件,用于测试,如下图: 该类被标记为@RestController,这意味着Spring MVC可以使用它来处理Web请求。@RequestMapping映射‘/’到该类的index()方法。 从浏览器调用或在命令行上使用curl时,该方法返回纯文本。 那是因为@RestController是复合注解,它将@Controller和@ResponseBody组合在一起,这两个注解会使Spring Mvc处理Web请求返回的是数据而不是视图。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/101816_41ccc0d0_5631448.png "屏幕截图.png") #### 9、 定义一个CommandLineRunner的Bean,用于检查Spring Boot应用程序启动完成后在Spring IoC容器中注册的所有Bean。如下图: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/105050_4354dd83_5631448.png "屏幕截图.png") 输出结果 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/105130_4989bb53_5631448.png "屏幕截图.png") 坑点(想使用@component注解,但发现有点不同): 首先先取回一个ApplicationContext对象; ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/105249_b6bcdd2f_5631448.png "屏幕截图.png") 使用@component修饰实现了CommandLine的内部类 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/105333_721346a3_5631448.png "屏幕截图.png") 结果会报ApplicationContext对象空指针异常 这是由于。。。。。(图片上已经说明了情况) #### 10、 编写一个简单的单完测试。如下图: 说明: MockMvc来自Spring Test模块,它可以让您通过一组便捷的构建器类将HTTP请求发送到DispatcherServlet中,并对结果进行断言。 注意,这里使用@AutoConfigureMockMvc和@SpringBootTest。 1)@SpringBootTest 使用完@SpringBootTest后,将创建整个应用程序上下文(加载所有配置类的Bean)。 @SpringBootTest注解告诉SpringBoot去寻找一个主配置类(例如带有@SpringBootApplication的配置类),并使用它来启动Spring应用程序上下文。SpringBootTest加载完 整的应用程序并注入所有可能的bean,因此速度会很慢。 2)@AutoConfigureMockMvc Spring在该层处理传入的HTTP请求并将其交给您的控制器。这样,几乎使用了整个堆栈,并且将以与处理真实HTTP请求完全相同的方式调用您的代码,而无需启动Servlet容器 就可以进行测试。使用@AutoConfigureMockMvc注解后,则会在spring应用上下文创建MockMvc实例。在测试用例中可以注入MockMvc实例模拟http请求,MockMvc实例会把 http请求转交相应的controller处理,而且不需要启动tomcat等Servlet容器。 3)@WebMvcTest 与 @MockBean 还有另一种替代方法是使用@WebMvcTest注解,它要求Spring Boot仅创建上下文的Web层(仅实例化controller组件),其它组件需要自己手动Mock(如:使用@MockBean)。这样 就可以大大减少单元测试时初始化Spring上下文时加载的Bean数量,加快启动、测试Spring应用程序的速度。 与@WebMvcTes功能相类似的还有@DataJpaTest与@JsonTest。 无论使用哪种方法,Spring Boot都会自动尝试查找应用程序的主应用程序类,但是如果您要构建其他内容,则可以覆盖它或缩小它的范围。 代码: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/224531_19dfd120_5631448.png "屏幕截图.png") 运行结果: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/224617_c7c65f81_5631448.png "屏幕截图.png") 证明测试单元通过,输出跟断言一样 #### 11、 使用IntelliJ IDEA的HTTP Client工具测试控制器端口; 新建http request文件 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/154601_61b2b7b7_5631448.png "屏幕截图.png") 写入get请求 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/154710_fabf078b_5631448.png "屏幕截图.png") 运行 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0420/154740_93a10266_5631448.png "屏幕截图.png") #### 12、 在命令行中使用spring官方提供的mave插件 spring-boot 运行Spring Boot应用程序,并把嵌入式Servlet容器的默认端口8080改为9090; 命令行:mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=9090 运行结果: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/224417_cc7111da_5631448.png "屏幕截图.png") #### 13、 在属性文件中配置Spring Boot应用程序以debug模式运行。 说明: 在Debug模式下,Spring Boot在运行时会在终端显示更多的调式信息。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/223406_13cd85f8_5631448.png "屏幕截图.png") #### 14、 在命令行中编译、打包Spring Boot应用程序。 打包命令:mvn package 方法一: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/223433_7696bc16_5631448.png "屏幕截图.png") 方法二: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/223448_625d8ba0_5631448.png "屏幕截图.png") 打包结果: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/223521_b691b3bf_5631448.png "屏幕截图.png") #### 15、 在命令行中使用java命令运行Spring Boot应用程序的Jar文件。 命令:java -jar ./target/task1-0.0.1-SNAPSHOT.jar ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/223929_66f30928_5631448.png "屏幕截图.png") 运行结果: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/224009_0654f847_5631448.png "屏幕截图.png") #### 16、 在命令行中使用java命令运行Spring Boot应用程序的Jar文件,带参数改变嵌入式Servlet容器的默认端口8080改为9090。 说明: 带参数运行jar文件,可以改变很多spring boot内置的属性。 例如:改变当前激活的属性文件:spring.profiles.active。 应用场景:部署docker时使用。 命令:java -jar ./target/task1-0.0.1-SNAPSHOT.jar --server.port=9090 运行结果: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0423/224148_1cd5e325_5631448.png "屏幕截图.png") #### 17、 使用markdown标记语方编写实验报告,并生成README.md文件放在项目仓库的根目录。 已完成