SpringBoot配置详解

Author:SimpleWu

properteis文件属性参考大全

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\n lisi" //输出:SimpleWu换行 lisi)

单引号:不会转义字符,特殊字符不会被转义。(name: 'SimpleWu\n lisi' //输出:SimpleWu\n 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文件会变得非常庞大,不太方便我们进行维护。

我们可以对配置中的内容进行拆分,拆分到多个文件中。这样就提高了配置的可维护性。

引入外部配置文件:

  1. @PropertySource(value={"classpath:student.properties"})
  2. @ImportResource(locations={"classpath:spring.xml"}
  3. @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

文档块

在yml文档中,可以适用---来将一个文档拆分为多个文档块。可以在不同文档块中分别定义不同的环境。

然后通过spring.profiles=xxx来对文档块进行命名。最后通过第一个文档块制定spring.profiles.active=xxx来指定到底激活哪个文档块。

#application.yml
spring:
profiles:
active: dev #指定激活dev文档
---
server:
port: 8081
spring:
profiles: dev #给文档命名为dev

配置文件加载位置和顺序

springboot启动会扫描一下位置的配置文件作为springboot的默认配置文件。

  1. 项目路径下的config文件夹
  2. 项目路径下
  3. classpath路径下config文件夹
  4. classpath路径下

以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,如果冲突的情况,高优先级配置内容会覆盖低优先级配置内容。如果不冲突,形成互补配置。

我们也可以通过配置spring.config.location来改变默认配置。使用命令行方式加载,否则优先级不够。

java –jar xxxx.jar –spring.config.location=配置文件路径

外部配置加载顺序

pringBoot也可以从以下位置加载配置;优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置形成互补配置。

  1. 命令行参数
  2. 来自java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值
  6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  10. @Configuration注解类上的@PropertySource
  11. 通过SpringApplication.setDefaultProperties指定的默认属性

官方参考文档:https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config

springboot自动配置

SpringBoot启动会加载大量的自动配置类

我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;

我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)

给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;

自动配置原理:SpringBoot启动的时候,加载主配置类,开启了自动配置功能@EnableAutoConfiguration。

利用EnableAutoConfigurationImportSelector给容器中导入一些组件。

导入的文件在都配置在文件META‐INF/spring.factories中的EnableAutoConfiguration属性来获取的。每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置。

每一个自动配置类进行自动配置功能;

根据当前不同的条件判断,决定这个配置类是否生效?

这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

所有在配置文件中能配置的属性都是在xxxxProperties类中封装者‘;配置文件能配置什么就可以参照某个功能对应的这个属性类

springboot配置详解的更多相关文章

  1. SpringBoot | 第三章:springboot配置详解

    基于springboot的约定优于配置的原则,在多数情况下,启动一个应用时,基本上无需做太多的配置,应用就能正常启动.但在大部分开发环境下,添加额外配置是无所避免的,比如自定义应用端口号(比较在机器比 ...

  2. 第二篇:SpringBoot配置详解

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  3. SpringBoot—整合log4j2入门和log4j2.xml配置详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   对于一个线上程序或者服务而言,重要的是要有日志输出,这样才能方便运维.而日志的输出需要有一定的规划,如日志命名.日志大小,日志分 ...

  4. SpringBoot @ConfigurationProperties详解

    文章目录 简介 添加依赖关系 一个简单的例子 属性嵌套 @ConfigurationProperties和@Bean 属性验证 属性转换 自定义Converter SpringBoot @Config ...

  5. Log4j配置详解(转)

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  6. logback 常用配置详解<appender>

    logback 常用配置详解 <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的 ...

  7. [转]阿里巴巴数据库连接池 druid配置详解

    一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...

  8. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  9. logback配置详解3<filter>

    logback 常用配置详解(三) <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一.返回DENY ...

随机推荐

  1. Django2.0 models中的on_delete参数

    一.外键.OneToOne字段等on_delete为必须参数   如下ForeignKey字段源码,to.on_delete为必须参数 to:关联的表 on_delete:当该表中的某条数据删除后,关 ...

  2. python关于二分查找

    楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72 ...

  3. SpringMVC DispatcherServlet在配置Rest url-pattern的一点技巧

    SpringMVC的Controller中已经有了@RequestMapping(value = "detail.do", method = RequestMethod.GET)的 ...

  4. kubernetes 将pod运行在某些特定的节点上,给节点打标签

    给节点打上标签: kubectl label node  <node_name> GPU=true   #打上标签 GPU=true 在创建pod的yaml文件时:  添加 nodeSel ...

  5. Django+Vue打造购物网站(九)

    支付宝沙箱环境配置 https://openhome.alipay.com/platform/appDaily.htm?tab=info 使用支付宝账号进行登陆 RSA私钥及公钥生成 https:// ...

  6. 【51NOD1965】奇怪的式子 min_25筛

    题目描述 给你\(n\),求 \[ \prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)} \] 对\({10}^{12}+39\)取模. \(\sigma_0(i)\)表示约数个 ...

  7. 后缀自动机(SAM)学习笔记

    目录 定义 SAM 的状态集 一些性质 SAM 的后缀链接 SAM 的转移函数 一些性质 算法构造 构造方法 时间复杂度证明 状态的数量 转移的数量 代码实现 实际应用 统计本质不同的子串个数 计算任 ...

  8. 【JVM】JVM内存结构 VS Java内存模型 VS Java对象模型

    原文:JVM内存结构 VS Java内存模型 VS Java对象模型 Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清 ...

  9. 求一个数组中重复数字的个数,要求复杂度为O(n)

    给出代码 #include <stdio.h> #include <unistd.h> #include <iostream> #include <memor ...

  10. 【Sql Server】SQL SERVER 收缩日志

    事务日志记录着在相关数据库上的操作,同时还存储数据库恢复(recovery)的相关信息. 收缩日志的原因有很多种,有些是考虑空间不足,有些则是应用程序限制导致的. 下面介绍的是在简单模式下,进行收缩操 ...