超全、超详的Spring Boot配置讲解笔记
springboot默认加载配置
SpringBoot使用两种全局的配置文件,全局配置文件可以对一些默认配置进行修改。
application.properties
application.yml
这两个配置文件使我们springboot启动的时候回默认加载的配置文件。
配置文件放在src/main/resources目录或者类路径/config下,这个配置文件的路径是有优先级的,至于优先级后面再说。
首先这两个文件中properties这个文件不需要多说使我们经常使用的资源文件,可是这个Yml是什么呢?后面再说
配置信息
SpringBoot不需要添加复杂的web.xml或者spring.xml等配置文件,spring只有一个配置文件,也非必须的。
默认的配置文件是application.properties。
#修改端口号
server.port=8888
#定义项目的访问目录
server.context-path=/springboot
我们使用IDEA需要注意,图就不截图太麻烦了:
如果properties文件中出现乱码,找到setting中,在file encoding中勾选Transparent native-to-asci conversion。
YAML文件
除了默认的properties文件,SpringBoot还提供另外一种配置文件yml,这种文件提供一种更加简洁的方式编写配置信息。
yml是YAML(YAML Ain‘t Markup Language)语言的文件,是一种标记语言,以数据为中心,比json、xml等更适合做配置文件,有想法的可以去网上搜搜资料学习下。
参考语法规范:
官方参考: http://www.yaml.org
yml学习参考:https://www.yiibai.com/yaml/yaml_syntax_primitives.html
YAML基本语法:
- 以键值对的方式表示属性。(空格必须有)。
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
- 属性和值是大小写敏感的。
例子:
server:
port: 8081
servlet:
context-path: springboot
注意:【:后必须跟一个空格】,两种方式推荐使用yml方式配置项目。
YAML语法
YAML支持的三种数据结构。
- 字面量:普通的值。(数字,字符串,布尔)
- 对象:键值对的集合。(Map)
- 数组:一组按次序排列的值。(List,Set)
字面量
YAML中字面量属于普通的值。以key: value来表示,value前必须带一个空格。
字面量,字符串默认不需要单双引号。
双引号:会转义字符,特殊字符会被转义。(name: "SimpleWu lisi" //输出:SimpleWu换行 lisi)
单引号:不会转义字符,特殊字符不会被转义。(name: 'SimpleWu lisi' //输出:SimpleWu lisi)
server:
port: 8081
对象、Map
在YAML中,对象和Map都是以键值对的方式表示。在下一行来编写属性和值得关系,注意缩进。
users:
firstName: SimpleWu
email: lovelyWu98k@gmail.com
对象还有另一种写法,看到这种写法是不是想到了JSON?
users: {
firstName: zhangsan,
email: lovelyWu98k@gmail.com
}
数组
用-值得方式来表示数组中的一个元素。
users:
- SimpleWu
- lovelyWu98k@gmail.com
- addressisnot
另外一种写法,还是像JSON
users: [SimpleWu,lovelyWu98k@gmail.com,addressisnot]
将配置映射到实体类
springboot支持我们直接将properties或者yml中的属性映射到某个实体类,看例子。
mysql:
url: jdbc:mysql:///springboot
port: 3306
user: root
pass: root
假如在资源中我们现在有个mysql的链接信息,我们如何将它映射到实体类中去呢?
有两种方式:
- @ConfigurationProperties指定从配置文件中读取属性,prefix指定对应yaml文件中的名称。
- @Value获取配置的属性值
@ConfigurationProperties
使用IDEA当我们添加了@ConfigurationProperties注解后,在页面上回出现一个错误提示,我们需要加入依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
编写JAVA类MySQLInfo.java
//java类
@ConfigurationProperties(prefix = "mysql")
@Component
public class MySQLInfo {
private String url;
private Integer port;
private String user;
private String pass;
//省略getset
}
我们只需要指定prefix即可,他就会加载我们yml配置前置为mysql的属性。
@Value
如果我们使用这个注解来获取属性使用方式是:
//java类
@Component
public class MySQLInfo {
@Value("${mysql.url}")
private String url;
@Value("${mysql.port}")
private Integer port;
@Value("${mysql.user}")
private String user;
@Value("${mysql.pass}")
private String pass;
//省略getset
}
注意如果需要使用表达式只有@Value才可以,@Value("#{10*2}) 结果为:20
两种方式的区别:
@ConfigurationProperties@Value功能批量注入配置文件中的属性一个个指定松散绑定支持属性名必须完全匹配SPEL表达式不支持支持JSR303效验支持不支持复杂类型支持不支持
两种方式的适用场合:
当只需要为某个值提供注入时,推荐使用@Value方式。
当需要对整个对象的整体进行赋值时,使用@ConfigurationProperties。
加载外部配置文件
如果我们将所有的配置信息都写在application.yml文件中,则到时候yml文件会变得非常庞大,不太方便我们进行维护。
我们可以对配置中的内容进行拆分,拆分到多个文件中。这样就提高了配置的可维护性。
引入外部配置文件:
- @PropertySource(value={"classpath:student.properties"})
- @ImportResource(locations={"classpath:spring.xml"}
- @Configuration和@Bean方式。(SpringBoot推荐方式)
第一种方式:@ProperSource方式:需要注入的类的前面使用该注解。
第二种方式:@ImportResource方式首先添加一个spring的配置文件,在里面添加需要映射的类。在启动的SpringBootApplication前面使用该注解
第三种方式:@Configuration和@Bean方式添加一个自定义配置类。
//第三种方式
@Configuration
public class MyConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public MySQLInfo mySQLInfo(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new MySQLInfo();
}
}
切换多个外部配置文件
真实环境中,有时候需要配置多个配置文件,可以使用spring.profile.active来进行切换。
比如现在我们有三个配置文件:
- application.yml
- application-dev.yml
- application-prod.yml
我们在application.yml中通过spring.profile.active = dev(prod)来选择需要加装的配置文件。
或者我们可以通过maven将项目打成jar包通过命令行使用以下命令来指定环境
java –jar springboot02-0.0.1-SHAPSHOT.jar –spring.profiles.active=dev</span class="hljs-attribute">
文档块
在yml文档中,可以适用---来将一个文档拆分为多个文档块。可以在不同文档块中分别定义不同的环境。
然后通过spring.profiles=xxx来对文档块进行命名。最后通过第一个文档块制定spring.profiles.active=xxx来指定到底激活哪个文档块。
#application.yml
spring:
profiles:
active: dev #指定激活dev文档
---
server:
port: 8081
spring:
profiles: dev #给文档命名为dev
配置文件加载位置和顺序
springboot启动会扫描一下位置的配置文件作为springboot的默认配置文件。
- 项目路径下的config文件夹
- 项目路径下
- classpath路径下config文件夹
- classpath路径下
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,如果冲突的情况,高优先级配置内容会覆盖低优先级配置内容。如果不冲突,形成互补配置。
我们也可以通过配置spring.config.location来改变默认配置。使用命令行方式加载,否则优先级不够。
java –jar xxxx.jar –spring.config.location=配置文件路径
外部配置加载顺序
pringBoot也可以从以下位置加载配置;优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置形成互补配置。
命令行参数
来自java:comp/env的JNDI属性
Java系统属性(System.getProperties())
操作系统环境变量
RandomValuePropertySource配置的random.*属性值
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
jar包内部的application.properties或application.yml(不带spring.profile)配置文件
@Configuration注解类上的@PropertySource
通过SpringApplication.setDefaultProperties指定的默认属性
springboot自动配置
SpringBoot启动会加载大量的自动配置类
我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;
自动配置原理:SpringBoot启动的时候,加载主配置类,开启了自动配置功能@EnableAutoConfiguration。
利用EnableAutoConfigurationImportSelector给容器中导入一些组件。
导入的文件在都配置在文件META‐INF/spring.factories中的EnableAutoConfiguration属性来获取的。每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置。
每一个自动配置类进行自动配置功能;
根据当前不同的条件判断,决定这个配置类是否生效?
这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
所有在配置文件中能配置的属性都是在xxxxProperties类中封装者‘;配置文件能配置什么就可以参照某个功能对应的这个属性类
百人微信讨论群,如果群二维码失效请加微信拉你入群 shengruxiahua3596 ,加微信请备注 程序员-java
超全、超详的Spring Boot配置讲解笔记的更多相关文章
- Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置
Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...
- spring boot 配置虚拟静态资源文件
我们实现的目的是:通过spring boot 配置静态资源访问的虚拟路径,可实现在服务器,或者在本地通过:http://ip地址:端口/资源路径/文件名 ,可直接访问文件 比如:我们本地电脑的:E: ...
- Spring Boot -- 配置切换指南
一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...
- 超全超详细的HTTP状态码大全(推荐抓包工具HTTP Analyzer V6.5.3)
超全超详细的HTTP状态码大全 本部分余下的内容会详细地介绍 HTTP 1.1中的状态码.这些状态码被分为五大类: 100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. ...
- Spring Boot 配置优先级顺序
一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...
- spring boot 配置注入
spring boot配置注入有变量方式和类方式(参见:<spring boot 自定义配置属性的各种方式>),变量中又要注意静态变量的注入(参见:spring boot 给静态变量注入值 ...
- 转帖: 一份超全超详细的 ADB 用法大全
增加一句 连接 网易mumu模拟器的方法 adb connect 127.0.0.1:7555 一份超全超详细的 ADB 用法大全 2016年08月28日 10:49:41 阅读数:35890 原文 ...
- Spring boot配置多个Redis数据源操作实例
原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...
- spring boot配置springMVC拦截器
spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...
随机推荐
- nginx 访问控制之 location
在生产环境中,我们会对某些特殊的请求进行限制,比如对网站的后台进行限制访问. 这就用到了location配置. 示例1: location /aming/ { deny all; } 说明:针对/am ...
- Zabbix实战-简易教程--中间件ZooKeeper监控
一.监控思路 通过zabbix trapper方式监控,之前看到网友们都是通过定时任务进行主动上传数据,但是,zabbix还有另外一神器--自动发现,也能达到同样的功能. 二.实现步骤 1.准备脚本 ...
- 为什么 Redis 单线程能支撑高并发?
阅读本文大概需要 4 分钟. 作者:Draveness 最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutipl ...
- leetcode 494. 目标数
题目描述: 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在你有两个符号 + 和 -.对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面. 返回可以 ...
- ModuleNotFoundError: No module named 'pymysql'
出现此提示表示系统中没有安装PyMySQL,可以通过pip PyMySQL进行安装. 安装之后,执行import pymysql仍然不可用! why? 检查后发现系统中存在python2与python ...
- Guava 库
https://www.yiibai.com/guava https://wizardforcel.gitbooks.io/guava-tutorial/content/1.html com.goog ...
- 关于RSA汇总
写在前面 安全测试需要, 后台数据需要签名, 前台验签, 于是有了这篇hao123. 正文 jsrsasign https://github.com/kjur/jsrsasign jsrsasign使 ...
- java 把 PEM 格式的公钥证书转换为 X.509 格式的证书
代码: @UtilityClass public final class X509Certs { private static final CertificateFactory CERTIFICATE ...
- python开发笔记-连接rabbitmq异常问题unacked处理
待补充 思路:捕获程序处理异常,异常情况下,也给队列生产者返回“确认”消息
- vue---引入外部样式
在用 vue-cli 进行项目开发的时候,经常会遇到要引入外部的样式,那该怎么做的呢? 示例:使用 import 引入 scss import variables from '@/assets/sty ...