SpringBoot简介
入门案例
回顾SpringMVC开发的步骤
- 创建工程,并在 pom.xml 配置文件中配置所依赖的坐标
- 编写 web3.0 的配置类
- 编写 SpringMVC 的配置类
- 编写 Controller 类
从上面的 SpringMVC 程序开发可以看到,前三步都是在搭建环境,而且这三步基本都是固定的。 SpringBoot 就是对这三 步进行简化了
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
- 创建新模块,选择Spring初始化,并配置模块相关基础信息
- 选择当前模块需要使用的技术集
- 开发控制器类
- 运行自动生成的Application类
做完 SpringBoot 的入门案例后,接下来对比一下 Spring 程序和 SpringBoot 程序。如下图
基于SpringBoot官网创建项目
SpringBoot项目快速启动
- 将 SpringBoot 工程打成 jar 包,该 jar 包运行不依赖于 Tomcat 和 Idea 这些工具也可以正常运行, 只是这个 jar 包在运行过程中连接和我们自己程序相同的 Mysql 数据库即可。
- SpringBoot 工程默认在pom.xml 中配置了如下插件
- 所以我们只需要使用 Maven 的 package 指令打包就会在 target 目录下生成对应的 jar 包。
- 进入 jar 包所在位置, 运行jar包
SpringBoot概述
SpringBoot 程序的优点
- 自动配置。 Spring 程序配置繁琐的问题
- 起步依赖。这个是用来解决 Spring 程序依赖设置繁琐的问题
- 辅助功能(内置服务器,...)。启动 SpringBoot 程序时使用 SpringBoot 内置的服务器
SpringBoot起步依赖
我们使用 `Spring Initializr` 方式创建的 `Maven` 工程的的 `pom.xml` 配置文件中自动生成了很多包含 `starter` 的依赖,如下图
- 这是指定了父工程, 可以理解为模板工程
- 进入到该父工程中,在该工程中我们可以看到配置内容结构如下图所示
- properties 标签中定义了各个技术软件依赖的版本,我们就不用自己指定版本了。
- 在 properties 中我们找 servlet 和 mysql 的版本如下图
- dependencyManagement 标签是进行依赖版本锁定;如果我们工程需要那个依赖只需要引入依赖的 groupid 和 artifactId 不需要定义 version。
- 而 build 标签中也对插件的版本进行了锁定,如下图
- springboot集成web开发的起步依赖
- 进入到该依赖,查看 pom.xml 的依赖会发现它引入了如下的依赖
- 里面的引入了 spring-web 和 spring-webmvc 的依赖,这就是为什么我们的工程中没有依赖这两个包还能正常使用 springMVC 中的注解的原因
- 而依赖 spring-boot-starter-tomcat ,从名字基本能确认内部依赖了 tomcat,所以我们的工程才能正常启动。
- 起步依赖极大简化了我们的依赖配置
SpringBoot程序主启动类
创建的每一个 SpringBoot 程序时都包含一个类似于下面的类,我们将这个类称作引导类
- SpringBoot 在创建项目时,采用jar的打包方式
- SpringBoot 的引导类是项目的入口,运行 main 方法就可以启动项目
- 因为我们在pom.xml 中配置了 spring-boot-starter-web 依赖, 运行 main 方法就可以使用内置 tomcat 启动咱们的工程
切换web服务器
现在我们启动工程使用的是 tomcat 服务器,那能不能不使用 tomcat 而使用 jetty 服务器。要切换 web 服务器就需要将默认的 tomcat 服务器给排除掉,怎么排除呢? 使用exclusion 标签
- Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty
- 对于我们来说, 开发项目很简单, 需要什么技术就把技术对应的起步依赖加到pom文件中, 如果要切换技术也简单, 先排除要替换的依赖, 再引入新的依赖, 我们就可以更专注于业务开发
基础配置
配置文件格式
SpringBoot提供了多种属性配置方式
- application.properties
- application.yml
- application.yaml
SpringBoot配置文件加载顺序(了解)
application.properties > application.yml > application.yaml
- SpringBoot核心配置文件名为application
- SpringBoot内置属性过多,且所有属性集中在一起修改,在使用时,通过提示键+关键字修改属性
在配合文件中如果没有提示,可以使用以下方式解决
yaml
YAML (YAML Ain't Markup Language),一种数据序列化格式
优点:
- 容易阅读
- 容易与脚本语言交互
- 以数据为核心,重数据轻格式
YAML文件扩展名
- ·yml(主流)
- .yaml
yaml语法规则
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格 (属性名与属性值之间使用冒号+空格作为分隔)
- # 表示注释
- 核心规则: 数据前面要加空格与冒号隔开
yaml数组数据
数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔
yaml数据读取
使用@Value读取单个数据,属性名引用方式: ${一级属性名.二级属性名...}
封装全部数据到Environment对象
自定义对象封装指定数据
如果自定义对象封装数据, 出现警告, 可以添加该依赖解决
多环境启动
以后在工作中,对于开发环境、测试环境、生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要该配置,将环境的配置改为线上环境的。
来回的修改配置会很麻烦,而 SpringBoot 给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。不 同类型的配置文件多环境开发的配置都不相同,接下来对不同类型的配置文件进行说明
在 application.yml 中使用 --- 来分割不同的配置,内容如下
最新用来起名字的配置项是
properties文件多环境启动
- 主启动配置文件application.properties
- 环境分类配置文件application-pro.properties
- 环境分类配置文件application-dev.properties
- 环境分类配置文件application-test.properties
带参数启动SpringBoot
参数加载优先顺序
- 参看: https://docs.spring.io/spring-boot/redirect.html?page=spring-boot-features#bootfeatures-external-config
- 如果使用了多种方式配合同一个配置项,优先级高的生效。
Maven与SpringBoot多环境兼容
- Maven中设置多环境属性
- SpringBoot中引用Maven属性
- 对资源文件开启对默认占位符的解析
- Maven打包加载到属性,打包顺利通过
配置文件分类
我们开发完毕后需要测试人员进行测试,由于测试环境和开发环境的很多配置都不相同,所以测试人员在运 行我们的工程时需要临时修改很多配置,如下
针对这种情况, SpringBoot 定义了配置文件不同的放置的位置;而放在不同位置的优先级时不同的。
SpringBoot 中4级配置文件放置位置:
作用:
- 1级与2级留做系统打包后设置通用属性
- 3级与4级用于系统开发阶段设置通用属性
在这里我们只演示不同级别配置文件放置位置的优先级。
- SpringBoot 工程,目录结构如下
- 在 resources 下创建一个名为 config 的目录,在该目录中创建 application.ym1 配置文件,而在该配置文件中将端口号设置为 81,内容如下
- 而在 resources 下创建的 application.ym] 配置文件中并将端口号设置为 80,内容如下
- 运行启动引导类,可以在控制台看到如下日志信息
- 通过这个结果可以得出类路径下的 config 下的配置文件优先于类路径下的配置文件。
- 要验证4级,按照以下步骤完成
- 将工程打成 jar 包, 在硬盘上找到 jar 包所在位置
- 在 jar 包所在位置创建 config 文件夹,在该文件夹下创建 application.yml 配置文件,将端口号设置为 82 , 然后运行程序, 运行后日志信息如下
- 通过这个结果可以得出file: config 下的配置文件优先于类路径下的配置文件
整合第三方技术
整合junit
回顾 Spring 整合 junit
使用 @ RunWith 注解指定运行器,使用 @ContextConfiguration 注解来指定配置类或者配置文件。
SpringBoot 整合 junit 特别简单,分为以下三步完成
- 在测试类上添加 SpringBootTest 注解
- 使用 @Autowired 注入要测试的资源
- 定义测试方法进行测试
@SpringBootTest注解
- 位置: 测试类定义上方
- 作用: 设置JUnit加载的SpringBoot启动类
- 范例:
- 相关属性
- classes: 设置SpringBoot启动类
- 如果测试类在SpringBoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定
- 如果测试类所在包和启动类所在包不一致, 就要通过classes属性指定SpringBoot启动类
- 为什么测试类和启动类的包要一致呢?
JUnit会把SpringBoot启动类作为Spring配置文件加载, 如果包不一致, 就找不到了
整合mybatis
- 创建新模块,选择Spring初始化,并配置模块相关基础信息
- 选择当前模块需要使用的技术集(MyBatis、MySQL)
- 设置数据源参数
- 定义数据层接口与映射配置
- 测试类中注入dao接口,测试功能
实现ssm整合
SpringBoot 到这就已经学习完毕,接下来我们将学习 SSM 时做的三大框架整合的案例用 SpringBoot 来实现一下。我们完成这个案例基本是将之前做的拷贝过来,修改成 SpringBoot 的即可,主要从以下几部分完成
- pom.xml
- 配置起步依赖,必要的资源坐标(druid)
- application.yml
- 设置数据源、端口等
- 配置类
- 全部删除
- dao
- 设置 @Mapper
- 测试类
- 页面
- 放置在resources目录下的static目录中
创建 SpringBoot 工程,在创建工程时需要勾选 web、 mysql、 mybatis,工程目录结构如下
由于我们工程中使用到了 Druid ,所以需要导入 Druid 的坐标
代码拷贝
需要修改的内容如下:
- config 包下的是配置类可以直接删除
- dao 包下的接口中添加 @Mapper 注解
- BookServiceTest 测试需要改成 SpringBoot 格式
配置文件
在 a pplication.yml 配置文件中需要配置如下内容
静态资源
在 SpringBoot 程序中是没有 静态资源需要放在 webapp 目录的,那么在 SpringBoot 程序中静态资源需要放在什么位置呢? resources 下的 static 下,如下图所示