[SpringBoot]
SpringBoot简介
入门案例
- 新建模块
- 开发控制器类
在 controller
包下创建 BookController
,代码如下:
1 |
|
- 启动服务器
运行 SpringBoot
工程不需要使用本地的 Tomcat
和 插件,只运行项目包下的 Application
类,我们就可以在控制台看出如下信息
使用
Postman
工具来测试我们的程序对比
做完SpringBoot
的入门案例后,接下来对比一下Spring
程序和SpringBoot
程序。如下图
坐标
Spring 程序中的坐标需要自己编写,而且坐标非常多
SpringBoot 程序中的坐标是我们在创建工程时进行勾选自动生成的
web3.0配置类
Spring 程序需要自己编写这个配置类。这个配置类大家之前编写过,肯定感觉很复杂
SpringBoot 程序不需要我们自己书写
配置类
Spring/SpringMVC 程序的配置类需要自己书写。而 SpringBoot 程序则不需要书写。
注意:基于Idea的 Spring Initializr
快速构建 SpringBoot
工程时需要联网。
官网构建工程(不用idea构建工程)
- 然后点击
Spring Initializr
超链接就会跳转到如下页面
- 打开下载好的压缩包可以看到工程结构和使用
Idea
生成的一模一样
SpringBoot工程快速启动
- 打包
由于我们在构建SpringBoot
工程时已经在pom.xml
中配置了如下插件
1 | <plugin> |
所以我们只需要使用 Maven
的 package
指令打包就会在 target
目录下生成对应的 Jar
包。
- 启动
进入jar
包所在位置,在命令提示符
中输入如下命令
1 | jar -jar springboot_01_quickstart-0.0.1-SNAPSHOT.jar |
执行上述命令就可以看到 SpringBoot
运行的日志信息
SpringBoot概述
SpringBoot
是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。
大家已经感受了 SpringBoot
程序,回过头看看 SpringBoot
主要作用是什么,就是简化 Spring
的搭建过程和开发过程。
原始 Spring
环境搭建和开发存在以下问题:
- 配置繁琐
- 依赖设置繁琐
SpringBoot
程序优点恰巧就是针对 Spring
的缺点
- 自动配置。这个是用来解决
Spring
程序配置繁琐的问题 - 起步依赖。这个是用来解决
Spring
程序依赖设置繁琐的问题 - 辅助功能(内置服务器,…)。我们在启动
SpringBoot
程序时既没有使用本地的tomcat
也没有使用tomcat
插件,而是使用SpringBoot
内置的服务器。
起步依赖
- 我们使用
Spring Initializr
方式创建的Maven
工程的的pom.xml
配置文件中自动生成了很多包含starter
的依赖,如下图
这些就是起步依赖,它定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的
parent:所有
SpringBoot
项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
程序启动
- 创建的每一个
SpringBoot
程序时都包含一个类似于下面的类,我们将这个类称作引导类
1 |
|
注意:
SpringBoot
在创建项目时,采用jar的打包方式SpringBoot
的引导类是项目的入口,运行main
方法就可以启动项目
因为我们在 pom.xml
中配置了 spring-boot-starter-web
依赖,而该依赖通过前面的学习知道它依赖 tomcat
,所以运行 main
方法就可以使用 tomcat
启动咱们的工程。
切换web服务器
- 现在我们启动工程使用的是
tomcat
服务器,那能不能不使用tomcat
而使用jetty
服务器,jetty
在我们maven
高级时讲maven
私服使用的服务器。而要切换web
服务器就需要将默认的tomcat
服务器给排除掉,怎么排除呢?使用exclusion
标签
1 | <dependency> |
- 引入
jetty
服务器。在pom.xml
中因为jetty
的起步依赖
1 | <dependency> |
SpringBoot配置文件
配置文件格式
我们现在启动服务器默认的端口号是
8080
,但在线上环境我们还是希望将端口号改为80
,这样在访问的时候就可以不写端口号了,修改方式如下:SpringBoot程序修改方式:
application.properties
1 | server.port=80 |
application.yml
1 | server: |
application.yaml
1 | server: |
注意:SpringBoot
程序的配置文件名必须是 application
,只是后缀名不同而已
在开发过程中,配置文件中如果没有提示,可以使用以下方式
- 点击
File
选中Project Structure
- 弹出如下窗口,按图中标记红框进行选择
- 通过上述操作,会弹出如下窗口
- 点击上图的
+
号,弹出选择该模块的配置文件
通过上述几步后,就可以看到如下界面。
properties
类型的配合文件有一个,ymal
类型的配置文件有两个这三种配置的优先级为:
application.properties
>application.yml
>application.yaml
yaml格式
yaml格式优点
YAML(YAML Ain’t Markup Language),一种数据序列化格式。这种格式的配置文件在近些年已经占有主导地位,这种配置文件和前期使用的配置文件是有一些优势的。
优点:
容易阅读
yaml
类型的配置文件比xml
类型的配置文件更容易阅读,结构更加清晰容易与脚本语言交互
以数据为核心,重数据轻格式
yaml
更注重数据,而xml
更注重格式
YAML 文件扩展名:
.yml
(主流).yaml
上面两种后缀名都可以,以后使用更多的还是 yml
的。
yaml格式语法规则
大小写敏感
属性层级关系使用多行描述,每行结尾使用冒号结束
使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
空格的个数并不重要,只要保证同层级的左侧对齐即可。
属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
# 表示注释
核心规则:数据前面要加空格与冒号隔开
yaml配置文件数据读取
使用 @Value注解
- 使用
@Value("表达式")
注解可以从配合文件中读取数据,注解中用于读取属性名引用方式是:${一级属性名.二级属性名……}
- 例如:我们可以在
BookController
中使用@Value
注解读取配合文件数据,如下
1 |
|
Environment对象
上面方式读取到的数据特别零散,SpringBoot
还可以使用 @Autowired
注解注入 Environment
对象的方式读取数据。这种方式 SpringBoot
会将配置文件中所有的数据封装到 Environment
对象中,如果需要使用哪个数据只需要通过调用 Environment
对象的 getProperty(String name)
方法获取。具体代码如下:
1 |
|
注意:这种方式,框架内容大量数据,而在开发中我们很少使用。
自定义对象
SpringBoot
还提供了将配置文件中的数据封装到我们自定义的实体类对象中的方式,可以通过使用 @ConfigurationProperties
注解实现。具体操作如下:
- 创建一个名为
MyConfig
的自定义配置类,用于封装配置文件中的数据:
1 |
|
- 在配置文件(如
application.yml
或application.properties
)中添加相应的属性:
1 | myapp: |
- 在使用
MyConfig
的地方,将其注入为一个 Spring Bean:
1 |
|
在上述示例中,MyConfig
类使用 @ConfigurationProperties
注解指定了配置文件中的前缀为 myapp
,因此它会尝试将 myapp.name
和 myapp.age
的值分别封装到 name
和 age
属性中。
然后,MyService
类通过构造函数注入了 MyConfig
实例,并可以在其中使用配置中的数据进行操作。
确保在使用 @ConfigurationProperties
的类上添加 @Component
、@Service
或其他适当的注解,以便使其成为 Spring 管理的 Bean。
这样,当应用程序启动时,Spring Boot 会自动将配置文件中的数据绑定到 MyConfig
对象,并将其注入到其他组件中使用。
注意:
使用第三种方式,在实体类上有如下警告提示
这个警告提示解决是在 pom.xml
中添加如下依赖即可
1 | <dependency> |
多环境配置
yaml文件配置
在 application.yml
中使用 ---
来分割不同的配置,内容如下
1 | #启用的配置 |
上述配置中的spring.profiles
配置项已经过时。最新用来起名字的配置项是
1 | #开发 |
properties文件
properties
类型的配置文件配置多环境需要定义不同的配置文件
application-dev.properties
是开发环境的配置文件。我们在该文件中配置端口号为80
1 | server.port=80 |
application-test.properties
是测试环境的配置文件。我们在该文件中配置端口号为81
1 | server.port=81 |
application-pro.properties
是生产环境的配置文件。我们在该文件中配置端口号为82
1 | server.port=82 |
多环境启动命令格式
方式
- 使用
SpringBoot
开发的程序以后都是打成jar
包,通过java -jar xxx.jar
的方式启动服务的.而通过命令行有以下三种方式来指定环境:
SpringBoot
提供了在运行jar
时设置开启指定的环境的方式
1 | java –jar xxx.jar –-spring.profiles.active=test |
- 指定端口号
1 | java –jar xxx.jar –-server.port=88 |
- 同时设置多个配置,比如即指定启用哪个环境配置,又临时指定端口
1 | java –jar springboot.jar –-server.port=88 --spring.profiles.active=test |
在打包到指定环境启动容易遇见的坑
在执行package命令前执行一次clean命令,防止之前执行结果影响打包
文件编码问题可能导致打包失败,去setting->Editor->File Encoding将Project Encoding和Default encoding for properties files改为utf-8即可
多环境开发兼容问题(maven和boot兼容)
- Maven中设置多环境配置
1 | <profiles> |
- SpringBoot中也设置了多环境,要使他们兼容,得让配置文件读取maven配置的多环境
1 | #设置启用的环境 |
- 设置完成后就会加载profile.active这个属性了
- 最终运行时配置文件中的
${profile.active}
会被修改为pom文件中指定的pro了
- 但这样直接打包仍会失败,因为Maven执行完毕后,其中类参与编译,但是配置文件没有编译,而是复制到包中
因此我们要对于源码中非java类的操作要求加载Maven对应的属性,解析
${}
占位符pom文件中添加插件
1 | <plugin> |
配置文件分类
SpringBoot
定义了配置文件不同的放置的位置;而放在不同位置的优先级时不同的。级别越高优先级越高
SpringBoot
中4级配置文件放置位置:
1级:classpath:application.yml
- 在
resources
下创建的application.yml
配置文件
- 在
2级:classpath:config/application.yml
- 在
resources
下创建一个名为config
的目录,在该目录中创建application.yml
配置文件
- 在
3级:file :application.yml
- 在
jar
包所在位置创建application.yml
配置文件
- 在
4级:file :config/application.yml
- 在
jar
包所在位置创建config
文件夹,在该文件夹下创建application.yml
配置文件
- 在
作用:
- 1级与2级留做系统打包后设置通用属性
- 3级和4级用于系统开发阶段设置通用属性
SpringBoot整合
SpringBoot整合junit
- 在
test/java
下创建com.itheima
包,在该包下创建测试类,将BookService
注入到该测试类中
1 | //第一步,加上该注解 |
SpringBoot整合mybatis
- 创建新模块,选择spring初始化,并配置模块相关基础信息
- 选择当前模块需要的技术集
- 在定义好实体类,dao接口后定义测试类
1 |
|
- 设置数据源参数
1 | spring: |
- 给dao接口加上
@Mapper
注解
Mybatis
会扫描接口并创建接口的代码对象交给Spring
管理,但是现在并没有告诉Mybatis
哪个是dao
接口。而我们要解决这个问题需要在Dao
接口上使用@Mapper
,例如
1 |
|
- 使用Druid数据源
- 导入
Druid
依赖 - 在
application.yml
配置文件配置
1 | spring: |