-
配置maven使用的jdk版本为1.8
:找到maven安装路径下的配置文件,例如我的是:E:\apache-maven-3.6.1\conf\settings.xml
,给profiles
标签添加以下内容:
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
- SpringBoot使用3种类型的全局配置文件,配置文件名
application
是固定的。作用:修改SpringBoot自动配置的默认值。配置文件放在src/main/resources
目录或者类路径/config
下。 -
YAML
:以数据
为中心,比json、xml等更适合做配置文件。
application.properties
application.yml
application.yaml
YAML语法
- 以
空格
缩进来控制层级关系
;只要是左对齐的一列数据,都是同一个层级。 -
键值对
:k: v
。如果冒号之后有值,那么冒号和值之间至少有一个空格,不能紧贴着。 -
字符串
:默认不用加上单引号或者双引号; -
双引号
;会转义字符串里面的特殊字符。例如:name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
。 -
单引号
;不会转义特殊字符。例如:name: 'zhangsan \n lisi':输出;zhangsan \n lisi
。 -
Object、Map
(属性和值)按照键值对k: v
的写法。例如:
# 注意缩进(层级之间为2个空格)
person:
name: 张三
gender: 男
age: 22
# 行内写法:
person: {name: 张三,gender: 男,age: 22}
-
数组、List、Set
用- 值
表示数组或集合中的一个元素。例如:
# 注意缩进(层级之间为2个空格)
fruits:
- 苹果
- 桃子
- 香蕉
# 行内写法:
fruits: [苹果,桃子,香蕉]
- 读取
.propterties文件
中的中文时出现乱码?原因:idea默认使用utf-8编码
,而properties文件默认使用ASCII编码
。解决方案:IDEA左上角File--->Settings--->搜索File Encodings--->修改下图对应的位置即可
- 配置文件值注入有两种方式,一个是Spring Boot的
@ConfigurationProperties注解
,另一个是Spring原先的@value注解
。
功能 | 松散绑定(松散语法) | SpEL | JSR303数据校验 | 复杂类型封装 | |
---|---|---|---|---|---|
@ConfigurationProperties | 批量注入配置文件中的属性 | 支持 | 不支持 | 支持 | 支持 |
@Value | 一个个指定 | 不支持 | 支持 | 不支持 | 不支持 |
- Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。
- 多profile文件形式:文件名格式:
application-{profile}.properties/yml
,例如:
application-dev.properties #开发环境
application-prod.properties #生产环境
- Springboot默认加载
application.properties/yml
配置文件,可以在默认加载的配置文件中激活加载指定的profile文件,例如:spring.profiles.active=dev
。 - yml文件支持
多文档块方式
,例如:
server:
port: 8082
spring:
profiles:
active: dev # 激活dev环境配置
--- # 每个文档块使用---分割
server:
port: 8888
spring:
profiles: dev # 命名当前文档块的环境名
---
server:
port: 8090
spring:
profiles: prod
- 激活指定的端口号也可在命令行运行时添加参数
--spring.profiles.active=dev
,另外还可以设置虚拟机参数VM options:-Dspring.profiles.active=dev
。
IDEA中2种参数设置方式
cmd添加配置参数
- springboot启动时会扫描以下位置的application.properties/yml文件作为Springboot的默认配置文件。
优先级由高到底
。高优先级的配置会覆盖
低优先级的配置。SpringBoot会从这四个位置全部加载主配置文件,形成互补配置
。
file:./config/
file:./
classpath:/config/
classpath:/
-
外部配置加载顺序
:优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
- 命令行参数,所有配置都可以在命令行上进行指定,例如:
java -jar xxx.jar --server.port=8087 --server.context-path=/abc
(多个配置用空格分开; --配置项=值
)- 来自java:comp/env的JNDI属性
- Java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找
;优先加载带profile
- **jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- **jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- **jar包内部的application.properties或application.yml(不带spring.profile)配置文件
@Conditional派生注解
:只有@Conditional
指定的条件成立时,才给容器中添加组件,里面配置的所有内容才能生效。
@Conditional扩展注解 | 作用(判断是否满足当前指定条件) |
---|---|
@ConditionalOnJava | 系统的java版本符合要求 |
@ConditionalOnBean | 容器中存在指定Bean |
@ConditionalOnMissingBean | 容器中不存在指定Bean |
@ConditionalOnExpression | 满足指定的SpEL表达式 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选Bean |
@ConditionalOnProperty | 系统中指定的属性有指定的值 |
@ConditionalOnResource | 类路径下存在指定资源文件 |
@ConditionalOnWebApplication | 当前是web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | JNDI存在指定项 |
在配置文件启用
debug=true
,运行时就可以在控制台中看到加载和没有加载了哪些自动配置类。其中,Positive matches
表示启用的自动配置类;Negative matches
:表示没有启用的自动配置类。市面上的日志框架有:
JUL
、JCL
、Jboss-logging
、logback
、log4j
、log4j2
、slf4j
....
日志门面 (日志的抽象层) | 日志门面 (日志的抽象层) |
---|---|
|
|
- 左边选一个门面(抽象层),右边选一个实现。例:SpringBoot选用
SLF4j-->Logback
- 用法参考slf4j官方文档
- 项目中可能使用不同的日志框架:Spring(commons-logging)、Hibernate(jboss-logging)...
- 如何将项目中的所有日志框架统一到slf4j?
- 将系统中其他日志框架先排除出去;
- 用中间包来替换原有的日志框架;
- 导入slf4j其他的实现。
- SpringBoot能自动适配所有的日志,而且其底层使用
slf4j+logback
的方式记录日志,引入其它框架时,只需要把这个框架依赖的日志框架排除掉即可。 - 输出日志级别:优先级由低到高:trace<debug<info<warn<error
- 在
.properties配置文件中
修改输出日志的默认配置:
logging.file | logging.path | Example | Description |
---|---|---|---|
(none) | (none) | 只在控制台输出 | |
指定文件名 | (none) | my.log | 默认输出日志到当前项目根路径下的my.log文件 |
(none) | 指定目录 | /spring/log | 输出日志到当前项目所在磁盘的根路径下的/spring/log/spring.log 文件 |
- 如果在项目的类路径下放置每个日志框架自定义的配置文件,那么SpringBoot启动时就不再使用它的默认配置。若使用
logback.xml
配置文件,则其直接被日志框架识别了;若使用logback-spring.xml
配置文件,日志框架就不直接加载日志的配置项,而是由SpringBoot解析日志配置,即可以使用SpringBoot的高级Profile功能。
Logging System(使用的日志框架) | Customization(自定义输出日志配置文件名) |
---|---|
Logback |
logback-spring.xml , logback-spring.groovy , logback.xml or logback.groovy
|
Log4j2 |
log4j2-spring.xml or log4j2.xml
|
JDK (Java Util Logging) | logging.properties |
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
<!-- 可以指定某段配置只在某个环境下生效 -->
</springProfile>
- 切换日志框架:可以按照slf4j的日志适配图,进行相关的切换。
静态资源映射规则
- 所有访问
/webjars/**
,都是去classpath:/META-INF/resources/webjars/
路径下找资源。webjars
:以jar包的方式引入静态资源。 - 参考webjars官网
- 访问jquery-webjars中静态资源文件jquery.js的url为:
http://localhost:8080/webjars/jquery/3.4.0/jquery.js
image.png
-
/**
表示访问当前项目的任何静态资源文件
,先去controller层中找是否有对应的处理请求,否则默认去以下4个路径中查找静态资源文件:
"classpath:/META-INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/"
- 非webjars资源,自定义的静态资源
css
、js
、img
文件全部放在static静态资源目录下,如访问Chart.mid.js文件的url为:http://localhost:8080/js/Chart.min.js
;访问url:http://localhost:8080/
则会默认寻找静态资源目录下的index.html
文件。
- 设置网站图标只需将一个
favicon.ico
图片放在静态资源目录下即可。 - 在
.properties文件
中设置默认访问静态资源文件的路径:spring.resources.static-locations=classpath:/hello,classpath:/zzw/
- 常见的模板引擎有:
JSP
、Velocity
、Freemarker
、Thymeleaf
等。SpringBoot推荐使用Thymeleaf
,在pom.xml文件中引入相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 只要把html页面放在
classpath:/templates/
目录下,thymeleaf模板引擎就能自动渲染页面。创建html页面后导入thymeleaf的名称空间,才能使用其功能语法:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
thymeleaf的语法规则
-
th:text
--> 改变当前元素里面的文本内容; -
th:任意html属性
--> 替换原生属性的值
- IDEA更改全局
.properties
文件的默认编码方法: