前言:
当前互联网后端开发中,JavaEE占据了主导地位。对JavaEE开发,首选框架是Spring框架。在传统的Spring开发中,需要使用大量的与业务无关的XML配置才能使Spring框架运行起来,这点备受许多开发者诟病。
随着Spring4.x发布,Spring已经完全脱离XML,只使用注解就可以运行项目。为了进一步简化Spring应用的开发,SpringBoot诞生了。它是由Pivotal团队提供的全新框架,其设计目的是简化Spring应用的搭建及开发过程,并迎合时下流行的分布式微服务设计思想,越来越多企业在使用SpringBoot。
本文重点:
1.讲解SpringBoot的设计初衷
2.讲解SpringBoot的开发环境要求
3.搭建SpringBoot的入门开发工程
4.讲解SpringBoot的配置文件常见配置
5.使用SpringBoot整合MyBatis
6.使用SpringBoot整合Redis进行简单的数据缓存
7.使用SpringBoot发送Http请求
8.使用SpringBoot进行简单代码测试
9.打包部署SpringBoot项目
一、SpringBoot简介
1.设计初衷
springboot为Spring开发者提供一种,更快速、体验更好的Spring应用开发方式。开箱即用,同时也可快速扩展,嵌入式的Tomcat。绝对没有冗余代码,无需XML配置。
单纯看这句话或许你还没有感觉,但如果你做过springmvc的项目开发,tomcat和xml文件你肯定不会陌生。那上面说的内置的tomcat和没有xml配置又是什么?咱们接着往下学习,很快你就能get到了。
2.核心功能
核心能力:Spring容器、日志、自动配置AutoCongfiguration、Starters web应用的能力:MVC、嵌入式容器。
数据访问(持久化):关系型数据库、非关系型数据库强大的整合其他技术的能力
测试:强悍的应用测试。
3.开发环境要求
本文及后续文章主要基于Spring Boot 的2.1.7.RELEASES正式发行版。
Java版本:Java8或Java 11;
Spring版本:5.1.8及以上;
构建工具版本:Maven 3.3及以上;
Servlet容器版本:SpringBoot 支持如下的嵌入式Servlet容器,Spring Boot应用程序最低支持到Servlet 3.1的容器。
当然我们一般使用的都是tomcat。
4.Spring怎么做Web开发?
回想一下,在使用springmvc时我们怎么开发一个web项目:
web.xml配置:SpringMVC核心控制器(DispatchServlet),Spring容器监听器,编码过滤器....
Spring 配置:包扫描(service、dao),配置数据源,配置事务....
SpringMVC配置:包扫描(controller),视图解析器,注解驱动,拦截器,静态资源....
日志配置...
编写少量业务代码
部署Tomcat 调试,每次测试都需要部署
这样总结起来,是不是很形象,很有感觉?但是如果用Spring Boot ,一切就将变得超简单。
下面我们就来体验,无需xml配置!!无感Tomcat!超迅速搭建功能强大的整套Web!的入门案例吧。
二、SpringBoot快速入门
1.Maven搭建SpringBoot工程
如果还不知道Maven,可以参见我的其它专题文章《Maven入门》和《Maven高级》。
案例目标:
Maven搭建SpringBoot工程,实现web的请求响应,最终在浏览器访问在页面中输出helloworld 。
实现步骤:
创建Maven工程
pom.xml文件中配置起步依赖
编写SpringBoot启动引导类
编写Controller
访问测试
实现过程:
- 创建Maven工程:day01_springboot_helloworld
至此,一个简单的基于maven的springboot工程框架就出来了。左侧的工程目录结构应该都比较熟悉了吧。咱们继续配置项目...
- pom.xml文件中配置父坐标和web的起步依赖
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--继承SpringBoot父POM文件-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
</parent>
<groupId>abc.java</groupId>
<artifactId>day01_springboot_helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--web开发依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
-
编写SpringBoot引导类
自己补全目录结构。
package abc.java;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName HelloWorldApplication
* @Version 1.0
**/
@Configuration //声明是个配置类
@EnableAutoConfiguration //开启自动配置
@ComponentScan //开启包扫描
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
- 编写三层架构代码:
这里我们只编写Controller,自己补全目录结构。
package abc.java.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @ClassName HelloWorldController
* @Version 1.0
**/
@Controller
@RequestMapping("/day01")
public class HelloWorldController {
@RequestMapping("/hello")
@ResponseBody
public String demo(){
return "Hello World!";
}
}
-
配置项目
也可以在这个位置上的Edit Configurations添加启动配置。稍微复杂一些,需要自己去找启动类。
- 访问http://localhost:8080/day01/hello测试
点击run或者debug启动项目
访问
能手敲出来就算入门了。
需要说明一下:
- pom需要什么依赖导入什么依赖即可。
- 启动引导类更简单,就是固定写法,不可能记不住。引导类是SprignBoot项目的入口,相当于类里面的main方法。
- controller就更不用说了,和mvc一样的,可能就是那几个注解可能不认识。没关系,这才是入门案例而已。
2.使用IDEA快速创建SpringBoot项目
刚才我们是使用的以往创建mvc项目的方法一步一步去完善项目结构,写出的springboot项目,但是在IDEA中提供了更为快捷的方式。
下面我们就开始在IDEA软件上,使用Spring Initializr方式创建SpringBoot工程,然后再一次实现入门案例的代码。但具体代码就不再提供了,因为都一样。只是创建过程更便捷。
实现步骤:
使用Spring Initializr创建SpringBoot
配置项目信息
勾选起步依赖
配置文件存储路径地址
再次编写入门案例三层架构代码
实现过程:
- 使用Spring Initializr创建SpringBoot工程
先说明一下,使用这种方式是需要联网的,如果你网络不好可能会需要多等待一会儿。如果等的太久,还是像入门案例那样,自己手动建maven项目吧。
-
配置项目信息
图片中尤其需要注意的是,启动引导类的位置必须和三层的目录在同一级别,而不是和三层里面的类一个级别。
-
勾选起步依赖
这里勾选了两个起步依赖。
- 配置文件存储路径地址
是不是很眼熟...一般不需要修改。
项目刚创建好之后,会进入很熟悉的界面,但是不要着急操作,下面的红框看一下,还在加载东西,刚才勾选的依赖都在导入,免得着急操作搞崩了。经验之谈...
如果你能看到这个DashBoard的提示,就展开它,选则开启DashBoard。如果没有也没关系,项目一样可以运行。
当然,也有办法能手动打开.参考着https://blog.csdn.net/m18633778874/article/details/82687389自己打开就行。有它会让你的操作方便很多,可能现在体会不出来,回头做微服务的时候,一个工程下面几十个springboot项目,如果没有它可能会比较繁琐一些。
创建好之后的项目结构如下:
把把标注的几个目录结构删除就行,用不到。
最后,你就会看到和我们之前手动创建的项目结构是一模一样的。
看一下自动创建的pom.xml文件。
截图没截全,下面还有个maven插件。毕竟是maven项目,一般不用。
再来看一看自动创建的启动引导类。目录结构是不是和我们改完之后的一样?main方法里面的代码是不是也一样?
一般情况下,我们肯定是只写简单的1个了。没办法,程序员都懒...
不同点在于注解:我们写了3个,他写了1个。为什么呢?
**@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan **
为什么这么说呢?点进@SpringBootApplication这个注解类看一下就知道了。
没看到@Configuration?再点进SpringBootConfiguration看,原来它是被Configuration给标记的,本身也是个用来标识配置的注解。所以传承先来不难理解了吧?
再往后就是编写入门案例三层架构代码,访问http://localhost:8080/hello接口测试,我们就不再重复写代码了。
3. 官网联网创建springboot项目
-
-
选择依赖
-
生成项目文件,压缩包,解压到指定目录
-
从IDEA中导入解压好的项目
-
调整项目目录结构
以上就是创建springboot项目的3中方式。后两种需要用网络,酌情使用即可。
提示:
用第一种方式或者偶尔不记得依赖maven坐标的时候,可以去maven仓库去查一下,找到合适的版本的地址,复制过来粘到pom文件里即可。
4. SpringBoot工程热部署
首先说,为什么需要热部署。没有热部署,每次修改代码后都需要重新部署项目,如果代码量比较多,修改次数比较多,反复操作比较繁琐。
实现热部署步骤
- 导入热部署依赖坐标
<!--spring-boot开发工具jar包,支持热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
-
开启IDEA自动编译支持
默认情况IDEA不会自动编译,需要设置Build Project Automatically。打上勾即可。需要说明,这个自动编译是每个项目都有各自的自动编译设置,不同项目都需要分别设置。
-
修改注册表
同时按下“ ctrl + shift + alt + / ” 组合键,会弹出Maintenance维护菜单,选择Registry(注册表)。需要说明的是,这个和自动编译不一样,改一次,以后就都生效了。
进去后,找到“允许运行期间启用自动编译”,看下图的英文哈,我懒得敲英文了。打上勾,close就行了。
如果按照以上操作后,修改项目代码时,发现没有自动部署,重启IDEA。
如果还不行,那就不行吧,无所谓的,因为本来也是时灵时不灵...手动“锤”一下来的更实际,绝对不会不成功。
三、SpringBoot原理分析
1.starters的原理
starters是依赖关系的整理和封装,是一系列关联依赖坐标的整合。
每个Starter包含了当前功能下的许多必备依赖坐标,这些依赖坐标是项目开发、上线和运行必须的,同时这些依赖也支持依赖传递。它可以让导入应用开发的依赖坐标更方便。举例:spring-boot-starter-web 包含了所有web开发必须的依赖坐标。
不理解?没关系,看图说话。
我们从maven的依赖结构或者点进starter-web去看,都可以看出starter里面其实封装了很多的依赖,他们共同组成了这个starter,所以有了这个starter就相当于有了开发web项目所必须的全部依赖,而不需要像以前一样,把下图中左侧的零散的依赖挨个复制粘贴一遍,因为已经合而为一了。
这也是"Write Less Do More"的一个真实写照。
starter的命名规范:官方的starter写法"spring-boot-starter-xxx" ,非官方的starter写法“第三方项目名-springboot-starter”
常用的starters可以自己查看一下官方文档。总之,非常多。
2. 依赖管理(Dependency Management)
- 继承了spring-boot-starter-parent 的好处和特点
- 默认编译Java 1.8
-
默认编码UTF-8
为什么这么说?看spring-boot-starter-parent 的properties标签。
-
通过spring-boot-denpendencies的pom管理所有公共Starter依赖的版本。
为什么这么说?我们再去点spring-boot-starter-parent看它的父级spring-boot-dependencies。我们发现,其实所有的依赖其实是在spring-boot-dependenciymanagement里面配置的。
所有的版本也都已经再这里限定了。
dependencymanagement和dependencies 标签的区别:父类放在dependencymanagement中的依赖,子类继承后并不会直接显现,而是可以从里面随用随取地导入依赖使用,不显式地声明使用,就不会生效;
而dependencies里面的starter,不管用不用,写在父类里,子类直接继承并生效。
- POM文件中的Maven插件
<!-- 作用:可以将一个SpringBoot的工程打包成为可执行的jar包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
如果想使用父pom文件中的任何插件,无需配置即可直接使用。
3.自动配置
SpringBoot采用约定大于配置设计思想,将所有可能遇到的配置信息提前配置好,写在自动配置的jar
包中。每个Starter基本都会有对应的自动配置。
自动配置的值在哪里?
查看启动类注解@SpringBootApplication
追踪步骤:
1.@EnableAutoConfiguration
2.@Import({AutoConfigurationImportSelector.class})
3.spring.factories
4.org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfigur ation
5.@EnableConfigurationProperties({ServerProperties.class})
6.private final ServerProperties.Tomcat tomcat = new ServerProperties.Tomcat();
知道有自动配置就行了,没必要深究。实用意义不大。