① 二、SpringBoot的配置--yaml
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
YAML 是一个标记语言
标记语言:
以前的配置文件;大多都使用的是xxx.xml文件
YAML:以数据为中心,比json、xml等更适合做配置文件
YAML:配置例子
XML:
k:(空格)v : 表示一对键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;
k: v :字面直接来写;
字符串默认不用加上单引号或者双引号;
"" :双引号;不会转义字符串里面的特殊字符; 特殊字符会作为本身想表示的意思
name : "zhangsan lisi" :输出 : zhangsan 换行 lisi
'' :单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: 'zhangsan lisi' : 输出 ; zhangsan lisi
k: v : 在下一行来写对象的属性和值的关系 ;注意缩进
对象还是 k: v 的方式
行内写法:
用- 值表示数组中的一个元素
行内写法
配置文件
javaBean:
我们可以导入配置文件处理器,以后编写配置就有提示了
调整 图示:
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
如果说,我们专门编写一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效
SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
不来编写Spring的配置文件
Spring Boot推荐给容器添加组件的方式;推荐全注解的方式
1、配置类@Configuration------>Spring配置文件
2、使用@Bean给容器中添加组件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
默认使用application.properties的配置
1、在配置文件中指定spring.profiles.active=dev
2、在命令行:
java -jar spring-boot-02-config.jar --spring.profiles.active=dev;
可以直接在测试的时候,配置传入命令行参数
3.虚拟机参数
-Dspring.profiles.active=dev
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件
-file:./config/
-file:./
-classpath:/config/
-classpath:/
优先级由高到低,高优先级的配置会覆盖低优先级的配置
SpringBoot会从这四个位置加载主配置文件:互补配置
==我们还可以通过spring.config.location来改变默认的配置文件位置==
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用互补配置;
java -jar spring-boot-02-config.jar --spring.config.location=G:/application.properties
==SpringBoot也可以从以下位置加载配置;优先级从高到低;高优先级的配置低优先级的配置,所有的配置会形成互补配置==
1.命令行参数
2.来自java:comp/env的JNDI属性
3.java系统属性
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
==有jar包外箱jar包内进行寻找==
==优先加载带profile==
6.jar包外部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件
==再来加载不带profile==
8.jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
精髓:
1》springboot启动会加载大量的自动配置类
2》我们看我们需要的功能有没有springboot默认写好的自动配置类
3》我们再来看这个自动配置类中到底配置了那些组件;(只要我们要用的组件有,我们就不需要再来配置了)
4》给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值
② springboot 多环境配置和切换
在实际开发中,我们往往需要用到开发,测试,生产等环境,为了方便环境的切换,springboot提供了profile功能.
profile是spring对不同坏境提供不同配置功能的支持,可以通过激活,指定参数等方式快速切换.
一共有三种方式,各位可以根据项目使用最适合自己的那一种.
第一种:配置文件激活: spring.profiles.active=dev
1,多profile文件形式----使用properties配置文件
在主配置文件编写的时候,文件名可以是 application-{profile}.properties,如图所示
2,多profile文档快模式----使用yml做配置文件
可以使用yml文档块方法配置不同环境,比properties更简洁方便,三条杠(---)作为分割,自定义profiles,active对应就可以了.请看具体实现.
结果是启动项目8082端口
第二种:使用命令行激活
1,命令行 --spring.profiles.active=dev
命令行方式有两种,一种是在IDEA中配置(eclipse中同样位置),一种在打包后使用cmd配置
2,打包,打包过程很多同学都熟悉,这里简单说一下,请看图
打包成功会出现两个以项目名开头的文件, 右键其中一个文件-show in Explorer,进入文件所在目录,在地址栏中输入cmd,进入命令行
输入以上命令 并Enter,就可以运行springboot,查看启动端口号,可以看到启动了8081.
其中spring-boot-0.0.1-SNAPSHOT.jar是你自己项目打包后的文件名,记得替换一下.
第三种:jvm参数方式激活 -Dspring.profiles.active=dev
和命令行的第一种配置在同一个地方,虚拟机配置也很简单,请看图片
点击apply-ok,启动后,使用的8081端口.
大致就是这三种激活方式,一般情况下都是使用的第一种配置文件激活,方便还不容易出错.
③ springBoot中的application.yml配置文件
有些用过springBoot工程的人总有疑惑,springBoot工程中是有一个application.yml配置文件的啊,其实application.yml的功能和application.properties是一样的,不过因为yml文件是树状结构,写起来有更好的层次感,更易于理解,所以很多人都选择了yml文件。
下面来说说将工程改成application.yml配置文件的详细步骤
第一步:在 application.properties 文件的同级目录下新建一个 application.yml 文件
第二步:添加application.yml文件中的配置如下:
server:
port: 8088
spring:
datasource:
name: test
url: jdbc:mysql://localhost:3306/test
username: root
password: xxx
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
如图所示:
第三步:删除原有的application.properties文件
文件结构如图示:
第四步,重新编译maven工程
找到maven工具栏,双击clean,待执行完成后,双击install,执行完成则编译成功。
第四步,重启springboot项目
没有任何问题:
The End
④ SpringBoot的自定义配置
SpringBoot免除了项目中大部分的手动配置,对一些特定情况,我们可以通过修改全局配置文件以适应具体生产环境,可以说,几乎所有的配置都可以写在application.properties文件中,SpringBoot会自动加载全局配置文件,从而免除我们手动加载的烦恼。但是,如果我们自定配置文件,SpringBoot是无法识别这些配置文件的,此时就需要我们手动加载。接下来,将针对SpringBoot的自定义配置文件及其加载方式进行讲解。
对于这种加载自定义配置文件的需求,可以使用@PropertySource注解结合@Configuration注解配置类的方式来实现。@PropertySource注解用于指定自定义配置文件的具体位置和名称。同时,为了保证SpringBoot能够扫描该注解,还需要类添加@Configuartion注解将实体类作为自定义配置类。
当然,如果需要将自定义配置文件中的属性值注入到对应类的属性中,可以使用@ConfigurationProperties或者@Value注解进行属性值注入
打开SpringBoot项目的resources目录,在项目的类路径下新建一个test.properties自定义配置文件,在该配置文件中编写需要的配置属性
在com.david.pojo包下新创建一个配置类MyProperties,提供 test.properties 自定义配置文件中对应的属性,并根据@PropertySource注解的使用进行相关配置
主要是一个自定义配置类,通过相关注解引入了自定的配置文件,并完成了自定义属性值的注入。针对示例中的几个注解,具体说明如下:
1)@Confiruation注解表示当前类是一个自定义配置类,并添加为Spring容器的组件,这里也可以使用传统的@Component注解
2)@PropertySource("classpath:properties")注解指定了自定义配置文件的位置和名称,此示例表示自定义配置文件为classpath类路径下的 test.properties 文件
3)@ConfigurationProperties(prefix="test")注解将上述自定义配置文件 test.properties 中以test开头的属性值注入到该配置类属性中
4)如果配置类上使用的是@Componnet注解而非@Configuration注解,那么@EnableConfigurationProperties注解还可以省略
在SpringBoot框架中,推荐使用配置类的方式向容器中添加和配置组件
在SpringBoot框架中,通常使用@Configuration注解定义一个配置类,SpringBoot会自动扫描和识别配置类,从而替换传统Spring框架中的XML配置文件。
当定义一个配置类后,还需要在类中的方法上使用@Bean注解进行组件配置,将方法的返回对象注入到Spring容器中,并且组件名称默认使用的是方法名,当然也可以使用@Bean注解的name或value属性自定义组件的名称
在项目下新建一个
⑤ springbootweb项目中修改服务器端口的配置属性是
一、修改默认配置
例1、spring boot 开发web应用的时候,默认tomcat的启动端口为8080,如果需要修改默认的端口,则需要在application.properties 添加以下记录:
server.port=8888
二、自定义属性配置
在application.properties中除了可以修改默认配置,我们还可以在这配置自定义的属性,并在实体bean中加载出来。
1、在application.properties中添加自定义属性配置
com.sam.name=sam
com.sam.age=11
com.sam.desc=magical sam
2、编写Bean类,加载属性
Sam类需要添加@Component注解,让spring在启动的时候扫描到该类,并添加到spring容器中。
第一种:使用spring支持的@Value()加载
package com.sam.demo.conf;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author sam
* @since 2017/7/15
*/
@Component
public class Sam {
//获取application.properties的属性
@Value("${com.sam.name}")
private String name;
@Value("${com.sam.age}")
private int age;
@Value("${com.sam.desc}")
private String desc;
//getter & setter
}
第二种:使用@ConfigurationProperties(prefix="") 设置前缀,属性上不需要添加注解。
package com.sam.demo.conf;
import org.springframework.stereotype.Component;
/**
* @author sam
* @since 2017/7/15
*/
@Component
@ConfigurationProperties(prefix = "com.sam")
public class Sam {
private String name;
private int age;
private String desc;
//getter & setter
}
三、自定义配置类
在Spring Boot框架中,通常使用@Configuration注解定义一个配置类,Spring Boot会自动扫描和识别配置类,从而替换传统Spring框架中的XML配置文件。
当定义一个配置类后,还需要在类中的方法上使用@Bean注解进行组件配置,将方法的返回对象注入到Spring容器中,并且组件名称默认使用的是方法名,
这里使用DataSource举例
package com.example.demo.config;
import javax.sql.DataSource;
@Slf4j
@Configuration
@EnableConfigurationProperties(JdbcPro.class)
public class DataSouce1Config {
@Value("${my.name}")
private String name ;
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Bean
@Primary
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(this.dbUrl);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
druidDataSource.setDriverClassName(driverClassName);
log.info("cccccccccccccccc");
log.info(this.name);
return druidDataSource;
}
}
Spring Boot 属性配置&自定义属性配置
⑥ SpringBoot 配置文件详解(告别XML)
快速学会和掌握 SpringBoot 的 核心配置文件的使用。
SpringBoot 提供了丰富的 外部配置 ,常见的有:
其中核心配置文件我们并不陌生,主要以Key-Value的形式进行配置,其中属性Key主要分为两种:
在 application.properties 添加配置如下:
① 添加数据源信息
在 application.propertis 添加配置如下:
① 添加认证信息,其中 socks.indentity.* 是自定义的属性前缀。
② 添加随机值,其中spring.test.* 是自定义的属性前缀。
使用方法: @ConfigurationProperties(prefix = "spring.datasource")
使用说明:提供 Setter方法 和 标记组件 Component
如何验证是否成功读取配置?答:这里可以简单做个验证,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:
使用方法: @Value("spring.datasource.*")
使用说明:提供 Setter方法 和 标记组件 Component
注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。
关于两者的简单功能对比:
显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。
SpringBoot 默认会加载这些路径加载核心配置文件,按优先级从高到低进行排列:具体规则详见 ConfigFileApplicationListener
如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出:
举个简单的例子,例如再上述位置都有一个application.properties ,并且每个文件都写入了server.port=xx (xx分别是9001,9002,9003,9004),在启动成功之后,最终应用的端口为:9004。图例:
如果想修改默认的加载路径 或者 调改默认的配置文件名,我们可以借助命令行参数进行指定,例如:
YAML是JSON的一个超集,是一种可轻松定义层次结构的数据格式。
答: 因为配置文件这东西,结构化越早接触越规范越好。这里推荐阅读阮一峰老师写的 YAML语言教程 ,写的很简单明了。
引入依赖: 在POM文件引入 snakeyaml 的依赖。
使用说明: 直接在类路径添加 application.yml 即可。
例如下面这两段配置是完全等价的:
① 在 application.yml 配置数据源:
② 在 application.properties 配置数据源:
在项目的实际开发中,我们往往需要根据不同的环境来加载不同的配置文件。例如生产环境,测试环境和开发环境等。此时,我们可以借助 Profiles 来指定加载哪些配置文件。例如:
温馨提示:如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者。
使用方法:
使用Maven插件打包好项目,然后在当前路径,执行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到应用端口变成了8081。
实现原理:
默认情况下,SpringBoot会将这些命令行参数转化成一个 Property ,并将其添加到 Environment 上下文。
温馨提示:
由于命令行参数优先级非常之高,基本高于所有常见的外部配置,所以使用的时候要谨慎。详见 PropertySource 执行顺序 。
关闭方法:
如果想禁用命令行属性,可以设置如下操作:springApplication.setAddCommandLineProperties(false)
⑦ Springboot配置文件读取-ConfigFileApplicationListener
ConfigFileApplicationListener 主要作用就是读取应用的配置文件并add到Environment的PropertySources列表里
Springboot应用在启动的时候准备好了环境后就会触发 事件就开始执行读取配置的逻辑:
首先加载当前激活的Profile列表
然后从默认的 classpath:/,classpath:/config/,file:./,file:./config/ 这四个目录下
查找默认的application-{profile}名字对应的配置文件,配置文件格式支持两大类(Properties和Yaml)既:.properties .xml .yml .yaml
可以修改默认的配置文件名字(默认:application),可以指定多个比如 --spring.config.name= application,demo
可以修改默认的配置文件路径,比如 --spring.config.location= file:///C:/config/ (目录结尾不带“/”会按照文件处理,而不是目录,容易掉坑)
阅读源码入口就从他的onApplicationEvent开始跟即可,将自身添加到postProcessor列表里并执行postProcessEnvironment方法,核心逻辑是靠一个Loader内部类
new Loader(environment, resourceLoader).load()
大概就是,如果没有spring.profiles.active 和 spring.profiles.include都没有特别指定激活的profile的话
没有特别指定profile的话就是:null + default,也就是我们常见的application.properties 和 application-default.properties这种
如果指定了那就是:null + 已经激活(pre-existing)的profile + spring.profiles.active + spring.profiles.include
举个例子,假如激活了多个profile比如:--spring.profiles.active=prd1,prd2,最终优先级上prd1 > prd2 > default(null)
⑧ Springboot 使用@RefreshScope 注解,实现配置文件的动态加载
实现配置文件动态读取的好处不必多说,修改配置文件后不必重启Application ,想想就开心。
合格调包侠的必备技能,从Maven仓库引入依赖的Jar包,
搞好配置文件,默认在application.yml /properties 就行,与本功能相关的配置项(采用yml格式)如下:
distributed-id是自定义需要动态部署的配置文件。management:是暴露refresh接口,不加此条配置将无法启用动态加载配置文件的功能(也就是管你理解不理解,别问,加就对了)。
1.编写自定义配置文件的Java对象,一定要在类上加@RefreshScope注解
@data是lombok的注解,别的注解不多说。
2.编写你的conroller ,也一定要加@RefreshScope注解, 不加的话,呵呵,对不起,无法运行。。原因吗---在这 @RefreshScope not working - Spring Boot - Stack Overflow
我这里是返回配置文件中distributed-id.mechineId的值。
3.到此为止了,简单吧😒。其实的话,第一步也可以直接在Bean的配置中心(也就是@Configuration注解的类)搞一下,效果是一样的。
使用这种写法,就可以不用在配置对象类上加@Component和@RefreshScope。
测试一下啦,启动应用前,将配置文件设置如下:
运行程序后,在浏览器输入你的测试地址,返回如下,是5没错了:
然后找到你编译后文件,修改配置文件的值,注意是 编译后的配置文件 就是下图中灰色文件的位置
修改如下:mechineId修改为4
接下来向 http://localhost:port/actuator/refresh 发送 POST 请求,get请求是无法识别的呦😘,可以看到返回了配置文件中被更改的属性
测试一下,没错了,返回值为4
⑨ 如何修改spring boot应用程序的配置文件
Spring Boot 是 Spring 产品中一个新的子项目,致力于简便快捷地搭建基于 Spring 的独立可运行的应用。大多数的 Spring Boot 应用只需要非常少的 Spring 配置。 你能够使用 Spring Boot 创建 Java 应用并通过 java -jar 来运行或者创建传统的通...
⑩ springboot配置文件总结
springboot 本身支持多种灵活的配置方式,为开发 springboot 程序带来了很大的灵活性和扩展性,但是同时由于太灵活,经常会导致明明配置了相关属性,却没有生效。
本文总结了 springboot 配置文件的原理以及多个配置文件生效的顺序。
springboot 配置文件支持灵活的路径,以及灵活的文件名,用一个变量表达式总结如下:
部分源码如下:
当满足上述变量表达式的配置文件有多个时,会有一个配置的优先级。假设
上面每个条件组合起来,则最多有配置文件如下,且顺序从上到下:
获取属性时,按从上到下的顺序遍历由上述文件生成的属性资源对象 PropertySource ,如果遇到匹配的key直接返回。
总结一下:就是如果同一个key的属性只出现一次,则直接取该值即可。如果同一个key的属性出现多次,则取顺序靠前的属性资源对象。另外其中每个文件都是可选的。
需要注意的一点是:如果在同一个 location 下配置了多个文件名一样的文件,则只会取一个,比如在 classpath:/ ,有如下两个文件 application.yml :
则只会根据 classloader 的 classpath 列表,选取第一个出现的文件。因为 springboot 加载配置文件时最底层是使用的下面的方法:
这两个方法只会获取 classloader 类的 ucp 属性里面第一个匹配到的值。如果对 springboot 自身的机制不满意,想获取所有的classpath:/路径下面的 applicaiton.yml 文件,可以使用下面的方法:
本文总结了 springboot 配置文件的原理以及多个配置文件生效的顺序。如果存在增加了配置文件或者在配置文件里面增加了属性却没有生效,可以参考上面的 springboot 配置文件表达式和配置文件生效顺序进行排查。
后面还会有一篇文章讨论基于 springboot 配置原理如何实现自定义的配置读取方式。