SpringBoot的功能
2014年
1.自动配置(核心功能)
2.起步依赖(核心功能)
3.辅助功能
嵌入式服务器
将Tomcat变成了jar包,放到了SpringBoot里面
举例:maven中的tomcat插件,就是把tomcat变成了jar包
不含版本冲突问题
Springboot特点:约定大于配置
SpringBoot快速入门
案例需求:
搭建Springboot工程,定义HelloController.hello()方法,返回"Hello SpringBoot"
实现步骤:
- 创建Maven项目
- 导入SpringBoot起步依赖
- 定义Controller
- 编写引导类
- 启动测试
创建pom
引入SpringBoot工层需要的父类工程
<!-- SpringBoot工程需要继承的父类工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
</parent>
Web开发起步依赖
<dependencies>
<!-- SpringBoot web开发起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写代码
编写web测试方法
public class UserController {
@RequestMapping("/sayHello")
public String sayHello(){
return "hello,my first SpringBoot";
}
}
调用SpringBoot–启用web 端口号8080
@SpringBootApplication//启动自动匹配注解等配置
//注意 Application类所在目录必须比需要匹配的类所在的
//目录更高级或者同一个目录
public class Application {
public static void main(String[] args) { SpringApplication.run(Application.class, args);
}
}
SpringBoot配置
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者**application.yml(application.yaml)**进行配置
配置文件分类
-
properties
-
xml
-
yml
此处以调整url为例
properties
server.port=8080
server.address=127.0.0.1
xml
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
yml(yaml)
server:
port: 8080
address: 127.0.0.1
同一目录下,配置文件的优先级问题-我的有错误…
很奇怪,我的顺序是 yaml>properties>yml
原因可能:目前版本是2.4.0;而资料都是2.4.0以下;
同一个目录下:
配置文件下的port设置:
查看了一下parent.pom:
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include> <include>**/application*.properties</include>
</includes>
正常来说,根据代码,顺序优先级应该为:
properties > yaml > yml
这个不用担心,基本不会配置重复的内容
yml(yaml)的配置格式
注意:在属性值":"后面一定要空一格,否则系统不会识别!!!
对象的属性值或者键值对
#单个键值对
name: jacklove
#对象(map)键值对的集合
user:
name: jack
pass: 123
数组
#数组(一组按次序排列的值)
girlfriend:
- xiaohong
- xiaoli
纯量
#纯量(单个的,不可再分的值)
msg1: 'ni \n hao'
msg2: "ni \n hao"
区别: msg1由 单引号 包括,不会识别转义字符,例如 \n;
msg2由 双引号 包括,能够识别转义字符
yml(yaml)的读取值的方法
方法一:@Vaule
对象的属性值或者键值对
@Value("${name}")
private String name;
@Value("${user.name}")
private String username;
@Value("${user.pass}")
private String password;
注意: @Value注解中的名称要 与 yaml中的保持一致
数组
@Value("${girlfriend[0]}")
private String name1;
@Value("${girlfriend[1]}")
private String name2;
纯量
@Value("${msg1}")
private String msg1;
@Value("${msg2}")
private String msg2;
区别: msg1由 单引号 包括,不会识别转义字符,例如 \n;
msg2由 双引号 包括,能够识别转义字符
方法二:通过Environment 环境对象
//调用 spring的Environment对象
@Autowired
private Environment env;
//调用 getProperty()方法
// env.getProperty("xxx") = @Value(${xxx})
env.getProperty("xxx")
方法三:@ConfigurationProperties
注意: 与前两种方法不同,该方法的核心在于,先新建bean,然后将properties的值通过注解@ConfigurationProperties注入至该bean中,然后再通过调用 该对象,起到调用值的作用
新建bean
//首先,将其先纳入spring的管理
@Component
//通过该注解,告诉spring,将properties中的值注入该类,而person则是告知 注入的值来源于 properties中的person:的内容
@ConfigurationProperties( prefix = "person")
public class Person {
在Controller中进行调用即可
@Autowired
private Person person;
System.out.println("person.getName() = " + person.getName());
System.out.println("person.getAge() = " + person.getAge());
底层原理:
根据properties中的属性名,寻找映射类中的set方法,通过set方法给对应属性赋值;
类似于 spring中的 注入
红条处理:
在pom中,添加对应的依赖,详情可以点击open documentation查看
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
作用:可以使,我们的properties获得 如何书写将值输入bean的格式的提示信息
结果
Profile
类似于maven高级中学习的多环境配置.
dev开发环境:开发用的数据库A
pro生产环境:真实的数据库B
test测试环境:测试用的数据库C
需要做到项目在这三个模式间的来回切换激活
profile配置方式(2种)
方式一:多profile文件方式
提供多个配置文件,每一个代表一种环境
通过主配置文件(application.properties进行选择):
spring.profiles.active=dev
方式二:yml多文档方式
在yml中使用 — 分隔不同配置
application.yml/yaml
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: test
---
server:
port: 8083
spring:
profiles: pro
---
spring:
profiles:
active: dev
补充:
如果 application.properties,yml,yaml同时存在,其判断顺序为
yaml > yml > properties
profile激活方式(3种)
核心代码: spring.profile.active=dev/test/pro
方式一:配置文件
在配置文件中配置:spring.profiles.active=dev
方式二:虚拟机参数
在VM option中进行配置:-Dspring.profiles.active=dev
方式三:命令行参数
跑jar,用cmd:
java -jar xxx.jar --spring.profiles.active=dev
补充说明:
1.关于以上配置方式中,“application-” 是springboot中配置文件的约定格式,不能改变;
还有就是可以把格式改成yml,语句改成yml的格式,还是可以正常运行的
2.关于yml隔断的玩法 — 必须是3个"-",不能多也不能少,吐槽一下随着应用软件增多,yml的内容也会不断增多,导致后期维护不好处理
SpringBoot配置
内部配置加载顺序
SpringBoot程序启动时,会从以下位置加载配置文件:
-
file: ./config/:当前项目下的/config目录下
-
file: ./:当前项目的根目录
(在resources文件夹外部,与模块同级)
-
classpath:/config/:classpath的/config目录
-
classpath:/:classpath的根目录
(在resources文件夹内部)
加载顺序为上文的排列顺序,高优先级配置的属性会生效
补充说明:
基本不会在内部进行配置文件
1.信息安全
2.方便运维,调整配置文件,而不重新package
外部配置加载顺序
以上可以查看配置文档的说明以及加载顺序
- 通过命令行参数引用外部配置文件:java -jar xxx.jar --spring.config.location= E://application.properties/yml
- cmd命令行执行时,所在的目录的 /config/application.properties/yml配置文件
- cmd命令行执行时,所在的目录的application.properties/yml配置文件
PS:外部配置的优先级比内部配置都要高(除了内部的激活操作)
SpringBoot整合其他框架
SpringBoot整合Junit
步骤:
-
搭建SpringBoot工厂
-
引入starter-test起步依赖
-
编写测试类
-
添加测试相关注解
@RunWith( SpringRunner.class )
@SpringBootTest( classes = 启动类.class )
-
开启测试
注意:
@SpringBootTest不填写()内容时,会根据package结构,自动寻找 启动类.class;不过如果你的test结构 和 java结构没有保持一致,可能会报错!
@RunWith中的SpringRunner.class不能写错,否则会报错:找不到对应的bean
中间可能需要导入一下junit4
SpringBoot整合Mybatis
步骤:
-
搭建SpringBoot工厂
-
引入mybatis起步依赖,添加mysql驱动
mybatis-spring-boot-starter
mysql-connector-java
-
编写DataSource和mybatis相关配置
-
定义表和实体类
-
编写dao和mapper文件/纯注解
-
测试
可能会报错:时区配置错误
解决方式:serverTimezone=UTC (UTC必须大写,否则不识别!!!)
配置文件:
spring:
datasource:
url: jdbc:mysql:///springboot?serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.driver
#如果不使用@select,则需要配置映射路径
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.itheima.springbootmybatis.domain
SpringBoot整合Redis
步骤:
- 搭建SpringBoot工厂
- 引入redis起步依赖
- 配置redis相关属性
- 注入RedisTemplate模板
- 编写测试方法,测试
导入依赖:
spring-boot-starter-data-redis
测试类:
redis默认的联机信息 就是本机的ip地址,如果是跨服务器的,还是需要自己进行配置的
配置文件:
spring:
redis:
host: 127.0.0.1
port: 6363
拓展
SpringBoot陌生配置(mapper-locations)
无论是spring或者springboot都是调用 mybatis中 MapperScanConfigure类的方法的,是实际存在的.
mapper-locations对应在 spring中的 注入方法是啥呢?
setMapperLocations()方法
补充:
@MapperScan=(${xxx}) 可以替代spring-mybatisConfig中的MapperScanConfig配置;