SpringBoot是用来快速构建Spring项目的一门技术
1.SpringBoot概述
1.1.SpringBoot概念
- 基于约定优于配置的思想,简化配置
- 顶级项目,和SpringFramework一个级别
- 本次课程使用的版本是2.1.8.RELEASE,参考文档https://docs.spring.io/spring-boot/docs/2.1.8.RELEASE/reference/html/
1.2.Spring缺点
- 写配置文件麻烦,尤其是整合其他技术的时候,需要写xml,复制过来,改一改
- 使用maven构建spring项目,引入很多的坐标,引入坐标不知道引入哪一个,上网查,另外引入坐标的版本是哪个,版本不兼容也会有问题
1.3.SpringBoot功能
- 自动配置:项目启动时,把spring需要的配置都自动完成了。
- 起步依赖:springboot把很多的坐标打了包,只要引入一个坐标即可,使用依赖传递的特性
- 嵌入式服务器:SpringBoot项目启动的时候,不需要配置额外的服务器。
1.4.小结
2.SpringBoot快速入门
2.1.快速入门基础版(手动创建maven项目)
- pom文件坐标获取
- 引导类以Application结尾,目录在controller包的上一级包下
- 访问http://localhost:8080/hello,端口号8080
- 小结
2.2.快速入门进阶版(idea快速构建)
3.SpringBoot起步依赖原理分析
3.1.spring-boot-starter-parent
- spring-boot-starter-parent有一个父spring-boot-dependencies
- spring-boot-dependencies里面规定了常用软件的version以及常用的一些坐标和版本
版本锁定 - 这些版本信息是经过精挑细选的,这些技术的版本是经过测试的,不会出现冲突
3.2.spring-boot-starter-web
- 依赖了一些坐标
我们项目间接依赖了spring-web和spring-webmvc两个坐标(依赖传递)
3.3.小结
4.SpringBoot配置
4.1.配置文件分类
- 现阶段配置文件名称必须是application
- 如果properties yml yaml都配置端口,properties 生效,同一级目录下三个配置文件都存在,优先级依次是properties> yml >yaml,低优先级的属性会被高优先级同名的属性覆盖
- 小结
4.2.yaml
4.2.1.简介
- properties不能体现层级关系
- xml可以体现层级关系,标签写着比较繁琐
- yml既可以体现层级,书写也比较简介。port和8080直接有空格,是一个分隔符。
4.2.2.基本语法
4.2.3.数据格式
4.2.4.小结
4.3.读取配置文件内容
yml可以配置两种内容,一种是被springboot自动识别的,另一种是自定义的,需要在程序里使用的,需要把配置的内容读取出来。读取配置内容的方式三种:
4.3.1.@Value
- spring-02_注解开发-2.2详细介绍
- 获取值比较麻烦,需要注入很多属性,单个值方便
4.3.2.Environment
-
比value方便,只需要注入一个对象。值少的话用value比较方便,因为只需要注入,不用调其他方法
4.3.3.@ConfigurationProperties
- 让配置内容和对象相互绑定
- 期待有一个person对象,将来直接把配置的内容注入到person对象的属性里
- person成员变量的setget方法名需要和配置的属性名一致
-
ConfigurationProperties使用需要指定前缀,配置文件可能有name 或者person下的name,需要指定注入哪个name
- 解决Person类红色提醒
关于配置,补充
1.常用配置 端口 路径
server.port=80
server.context-path=/HelloWorld
server.context-path默认是/ 可以加项目名
2.自定义带前缀属性
mysql.jdbcName=com.mysql.jdbc.Driver
mysql.dbUrl=jdbc:mysql://localhost:3306/db_boot
mysql.userName=root
mysql.password=123456
3.自定义属性获取
package com.lines.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloWorldController {
@Value("${helloWorld}")
private String helloWorld;
@Value("${mysql.jdbcName}")
private String jdbcName;
@Value("${mysql.dbUrl}")
private String dbUrl;
@Value("${mysql.userName}")
private String userName;
@Value("${mysql.password}")
private String password;
@ResponseBody
@RequestMapping("/showJdbc")
public String showJdbc() {
StringBuffer sb = new StringBuffer();
sb.append("mysql.jdbcName:")
.append(jdbcName)
.append("
")
.append("mysql.dbUrl:")
.append(dbUrl)
.append("
").append("mysql.userName:")
.append(userName)
.append("
").append("mysql.password:")
.append(password)
.append("
")
;
return sb.toString();
}
@ResponseBody
@RequestMapping("/helloWorld")
public String say() {
// return "springboot 你好";
return helloWorld;
}
}
4.属性封装
package com.lines.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "mysql")
public class MysqlProperties {
private String jdbcName;
private String dbUrl;
private String userName;
private String password;
public String getJdbcName() {
return jdbcName;
}
public void setJdbcName(String jdbcName) {
this.jdbcName = jdbcName;
}
public String getDbUrl() {
return dbUrl;
}
public void setDbUrl(String dbUrl) {
this.dbUrl = dbUrl;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
5.封装后属性获取
package com.lines.controller;
import com.lines.properties.MysqlProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloWorldController2 {
@Autowired
private MysqlProperties mysqlProperties;
@ResponseBody
@RequestMapping("/showJdbc2")
public String showJdbc() {
StringBuffer sb = new StringBuffer();
sb.append("mysql.jdbcName:")
.append(mysqlProperties.getJdbcName())
.append("
")
.append("mysql.dbUrl:")
.append(mysqlProperties.getDbUrl())
.append("
").append("mysql.userName:")
.append(mysqlProperties.getUserName())
.append("
").append("mysql.password:")
.append(mysqlProperties.getPassword())
.append("
")
;
return sb.toString();
}
}
4.4.profile
4.4.1.profile配置方式
- 配置多个properties文件(yml也可以),模拟开发、测试、生产的配置文件,不激活,用的默认端口
- yml多文档方式:一个yml文件通过---分割成不同的部分,每一个部分代表一个环境的配置
4.4.2.profile激活方式
- 激活方式一:配置
包含yml文档中写激活信息
- 激活方式二:虚拟机参数。部署的时候不用改配置文件。
-Dspring.profiles.active=test
- 激活方式三:命令行参数
--spring.profiles.active=pro
- 激活方式二、三不依赖于idea,模拟服务器环境启动:
java -jar .\springboot-profiles-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro
4.4.3.小结
4.5.内部配置加载顺序
- resources目录下的文件打包之后就是在classpath:/目录下
4.5.1.演示一
创建项目下的配置文件分别配置端口号8084 8083 8082 8081(对应优先级由高到低的配置文件)
4.5.2.演示二
低优先级的文件不是不加载,只是相同的属性被高优先级的文件覆盖了
- 模块config下有配置文件,config外的配置文件书写没有提示解决:先把config下的配置文件删除,config外的配置文件内容清楚,再书写就有提示了
4.6.外部配置加载顺序
4.6.1.概述
https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/html/boot-features-external-config.html
4.6.2.命令行加载配置演示(参数写在命令后面)
- 打包
- springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0...修改maven-resources-plugin的版本
org.apache.maven.plugins
maven-resources-plugin
2.4.3
- idea运行的时候因为项目根目录有配置文件,端口号是8084,优先级最高,所以启动的时候8084
- jar方式运行,端口是8082,因为项目路径下的两个配置文件打包不会打进来,打包里面只有两个配置文件,取config下的配置
- jar方式运行可以命令行直接加端口号,优先级比配置文件高java -jar .\springboot-config-0.0.1-SNAPSHOT.jar --server.port=8083
- jar方式运行可以指定多个参数java -jar .\springboot-config-0.0.1-SNAPSHOT.jar --server.port=8083 --server.servlet.context-path=/hehe
4.6.3.命令行加载配置演示(配置写在文件中,命令后面去引用文件)
- 命令行方式可以指定多个参数,但是如果参数太多,也不方便,可以指定外部的配置文件
- F盘复制一份配置文件,内容如下
- java -jar .\springboot-config-0.0.1-SNAPSHOT.jar --spring.config.location=F://application.properties
4.6.4.命令行加载配置演示(不指定参数)
- 前面两种命令行加载配置都需要指定参数,能否不指定参数
- 把配置文件放在和jar包同级,自动加载
- java -jar .\springboot-config-0.0.1-SNAPSHOT.jar
- jar所在的目录新建config目录,里面放配置文件。现在根目录下有配置文件,根目录的config目录也有配置文件,config下配置文件优先级高
- 外部的配置和内部的配置形成互补配置,项目写完了,部署的时候,发现有个配置写错了,有两种处理,一项目改配置,重新打包。二外部提供配置文件,覆盖某些属性,外部的配置优先生效。
5.SpringBoot整合其他框架
5.1.Junit
- 实操
- 如果测试用例所在的包和引导类所在包一样或者在引导类所在的包的子包中,classes是不需要指定的
5.2.Redis
- 修改redis配置
5.3.mybatis
5.3.1.概述
起步依赖的命名,以springboot开头的都是官方提供的,以mybatis开头的是其他组织提供的,mybatis期望和springboot整合,但是springboot没有写,所以mybatis自己写了一套
CREATE DATABASE /*!32312 IF NOT EXISTS*/`springboot` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
USE `springboot`;
/*Table structure for table `t_user` */
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*Data for the table `t_user` */
insert into `t_user`(`id`,`username`,`password`) values (1,'zhangsan','123'),(2,'lisi','234');
5.3.2.注解方式
注意:mysql驱动导入进来的时候scope是运行时,但是配置文件会报错,不影响使用,为了不报错,把scope注释掉