ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

只有搞Java开发的才知道!SpringBoot之配置文件

2021-08-04 23:02:30  阅读:111  来源: 互联网

标签:Java SpringBoot 配置文件 配置 private img ConfigurationProperties


程序员跳槽时机已到,闲聊中面试官无意泄题

SpringBoot作为日常开发利器,开箱即用,大量的star等已经成为节省开发的重要框架之一,但是各个框架的star中引入的日志框架却不尽相同,有的是log4j,有的是slf4j,这导致我们在引入多个框架的star的时候,往往会引入多个日志框架,每一个日志框架彼此效率不尽相同,那么我们能不能做到在项目中仅引入一个统一的日志框架呢?本篇我们就来探索SpringBoot如何实现统一日志操作

上一篇我们详细的学习了SpringBoot的统一日志处理机制,以及通过slf4j的桥接原理实现了本地日志与分布式日志合并实践,本篇我们来详细的探索SpringBoot中的配置文件

SpringBoot配置文件

在SpringBoot中常见的参数的配置,都会默认自动配置,并且提供了一个默认的全局配置文件,文件名固定,如下:

application.properties
application.yml

可以看到除了常见的properties配置文件以外,SpringBoot中还引入了yml文件作为配置文件,效果等同于properties,并且官方默认推荐使用yml来替代properties文件,究其原因和properties文件灵活性以及编码问题等相关,也和yml配置文件自身的灵活特性有关,接下来我们来学习一下yml文件的常见基本语法

YAML配置文件语法

为什么Yaml更适合做配置文件

在以前Spring时代,大多数配置文件都使用的是xxx.xml等,需要遵循严格的语法与标签语义化实现配置,配置复杂繁多,而YAML(YAML Ain’t Markup Language)以数据为中心,比起json、xml等更关注于配置项与数据,自身语法较松散灵活,并不严格局限语法,所以更适合做配置文件,举个例子:

server:
  port: 8081

而这个简单的配置在xml中则是需要如下配置:

<server>
	<port>8081</port>    
</server>

YAML基本语法

YAML的基本语法为K:(空格)v :表示一堆键值对(需要注意的是这里的空格必须有,而且千万别用tab键!),在yaml中唯一的局限是每个层级之间必须依靠空格来控制,只要是左对齐的一列数据都是同一个层级的属性和值,同样的如果需要在下一个层级,必须要在上一层的配置右边空格两位,举例如下:

server:
    port: 8081
    path: /demo

需要注意的是在YAML中也是大小写敏感的,千万不要写错哦

普通值、对象、Map与数组

在YAML中支持更多类型的数据,主要分为普通数值(包括数字、字符串、布尔类型等常见基础类型);对象与Map类型(包括复杂对象类型);以及数组类型(包括Set、List等)。我们来逐一看看各种类型在YAML中的语法:

1.普通类型值

可以在YAML文件中直接按照K:(空格)v 的格式直接填写,但是需要注意的是字符串类型值,在yaml中字符串的值与其他值一样,不需要添加“”或者‘’修饰,在yaml中如果添加了“”(双引号),代表在双引号范围内的字符串的特殊字符并不需要进行转义,会按照原样符号意义输出,例如:

name: "zhangsan \n lisi"

输出的结果为: zhangsan 换行 lisi

如果是添加了’’(单引号)会将当前的单引号内的字符串中所有的特殊字符进行转义,输出为普通的字符串,例如:

name: 'zhangsan \n lisi'

输出的结果为 : zhangsan \n lisi

2.对象类型与Map类型

在yaml中对象类型和Map类型的写法都是一样的,层级代表当前属性所在的层级,而每个属性的key就是yaml的key,例如:

demo:
  lastName: zhangsan        
  age: 20 

而demo可以是一个Map,包含了lastName以及age的key,也可以是一个对象实例,包含这两个名叫lastName以及age的属性

3.数组(Set、List)类型

在yaml中对于数组类型的值有两种支持的写法,第一种写法每一个值对应数组中的一个值,没有key,变为-替代,如下:

pets:
 ‐ cat
 ‐ dog
 ‐ pig

而第二种写法则是yaml对于这类数组类型的优化写法,支持将值写入一行,代表一个数组的值,使用[]进行包裹,如下:

pets: [cat,dog,pig]

自动注入配置文件

了解了yaml的基础语法以后,我们来使用SpringBoot的配置文件自动注入来读取我们的配置参数,在SpringBoot中,我们可以将测试文件编写一个对应的实体类Bean,将Bean申明给Spring接管,并且在类上标记@ConfigurationProperties注解,添加此注解后,SpringBoot会将配置文件中的每一个属性的值,映射到这个Bean中,而在ConfigurationProperties注解中有prefix参数可填,代表着将配置文件中的哪一部分与当前的Bean进行匹配注入,即可将配置文件的值注入到实体Bean中,例子如下:

person:
    lastName: hello
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
      ‐ lisi
      ‐ zhaoliu
    dog:
      name: 小狗
      age: 12

对应的实体Bean为:

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定,默认是application.yml/application.properties;
 *      prefix = "person":配置文件中哪个key开始将下面的所有属性进行一一映射
 * 只有当前实体Bean是容器中的组件,才能使用      @ConfigurationProperties开启自动注入配置功能;
 *
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

使用这个功能,我们还可以将配置文件处理器的依赖添加进来,以后再去编写配置文件的时候就有属性提示了,会自动帮我们查找关联当前配置文件的实体Bean,pom坐标如下:

<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐>
<dependency>        
    <groupId>org.springframework.boot</groupId>            
    <artifactId>spring‐boot‐configuration‐processor</artifactId>            
    <optional>true</optional>            
</dependency>

在需要获取对应配置的地方使用自动注入B该实体Bean即可

使用@Value获取值和@ConfigurationProperties获取值比较

同样在SpringBoot中我们还可以通过传统的方式–@Value注解的方式,将配置文件中的每一个属性单独注入到指定的字段中,而使用@Value和使用**@ConfigurationProperties**方式注入配置文件有何不同?我们将两种方式的区别是局限性列了表格,作为参照,表格如下:

@ConfigurationProperties@Value
功能批量注入配置文件中的属性一个个指定
松散绑定(松散语法)支持不支持
SpEL语法不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

前面我们通过@ConfigurationProperties读取了application.yml的配置信息,那么我们能不能读取其他的配置文件加载进对应的配置bean中呢?在SpringBoot中提供了一个**@PropertySource**的注解,可以指定加载的配置文件,例如:

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
}

这样就可以指定其他的配置文件加载进对应的配置实体中

ImportResource

我们在使用Spring编程的时候,往往喜欢使用xml配置的方式配置对应的bean实例,而在SpringBoot中可以通过**@ImportResource**注解的方式,导入对应的xml配置文件,将其配置在某个配置类上,即可将xml配置文件中的实例注册,例如我们现在编写一个xml配置文件:

<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring‐beans.xsd">
    <bean id="helloService" class="com.atguigu.springboot.service.HelloService"></bean>
</beans>

然后使用@ImportResource将xml配置文件导入:

//导入Spring的配置文件让其生效
## 总结

总的来说,面试是有套路的,一面基础,二面架构,三面个人。

**最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友,[点击这里即可免费获取](https://gitee.com/vip204888/java-p7)**

![三面蚂蚁金服成功拿到offer后,他说他累了](https://www.icode9.com/i/ll/?i=img_convert/6e1de72e700d50187bb448d5b996b074.png)

![三面蚂蚁金服成功拿到offer后,他说他累了](https://www.icode9.com/i/ll/?i=img_convert/fb11aa8acc3b5a75becb9ca8ce014dda.png)

![三面蚂蚁金服成功拿到offer后,他说他累了](https://www.icode9.com/i/ll/?i=img_convert/d560c2e5e5732a8d295091f95a0b8e5a.png)

答案)、书籍、视频等。希望也能帮助想进大厂的朋友,[点击这里即可免费获取](https://gitee.com/vip204888/java-p7)**

[外链图片转存中...(img-Bq8RNWJR-1628089029826)]

[外链图片转存中...(img-gO4UxI8s-1628089029829)]

[外链图片转存中...(img-pCGzBfQI-1628089029831)]

标签:Java,SpringBoot,配置文件,配置,private,img,ConfigurationProperties
来源: https://blog.csdn.net/m0_60452957/article/details/119395195

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有