SpringBoot中幕——配置文件properties与yml
⭐️前面的话⭐️
本篇文章将介绍有关SpringBoot的配置文件,SpringBoot的配置文件格式有两种,一种是项目中默认生成的properties文件,另外一种就是yml格式的配置文件,yml文件可以理解为properties文件的升级版,yml语法没有properties语法那么沉余,并且更通用。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆首发时间:🌴2022年8月31日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《SpringBoot实战》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
1.配置文件的作用
整个项目中所有重要的数据都是在配置文件中配置的,比如∶
- 数据库的连接信息(包含用户名和密码的设置);
- 项目的启动端口;
- 第三方系统的调用秘钥等信息;
- 用于发现和定位问题的普通日志和异常日志,
- 还可以自定义配置,如配置上传文件的保存地址信息等。
想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。
配置文件分为两类与,一类是系统配置文件,这种配置的格式都是固定的,另外一种是用户自定义配置文件,用户可以随意地规定配置文件的格式。
2.配置文件格式
SpringBoot项目配置文件有两种,一种是出生较早的properties
文件,还有另外一种比较新的yml
文件。
其实properties
文件与yml
文件就是一个老实与新式的关系,就像小米6与小米12之间的关系一样,yml
文件相比于properties
文件做了一些优化,如yml
文件天然支持中文字符,而properties
文件默认是不支持中文字符的,如果不进行字符配置,输入中文字符就会乱码。
如何配置properties
文件默认字符编码呢?过程如下图:
当然,和配置国内源一样,还需要对新建项目设置做出相同的设置。
设置完成,记得把原来的那个配置文件删除,重新新建一个,毕竟已经存在的配置文件格式的编码仍然不是UTF8。
配置文件是存在与resources
目录下的,对于SpringBoot项目默认的配置文件,配置文件名必须是application
,即application.properties
或application.yml
文件,如果配置文件名不为application
那就不能够被识别。
当application.properties
或application.yml
两个文件共存是,老式配置文件优先,也就是application.properties
生效。
3.配置文件的使用方法
先介绍一个小插件,如果是IDEA专业版可以忽略,对于社区版IDEA来说,默认是没有配置文件的代码提示的,我们安装一个插件来提高我们的开发效率。
这款插件名字叫做spring tools
,在IDEA插件安装页面搜索安装就行,毕竟在我之前的文章已经演示很多次如何安装第三方插件了,这里就不细说了。
当然,专业版的IDEA自带,不需要安装额外的插件。
3.1properties配置文件
基本语法:
# key与=与value之间不要加空格
key=value
栗子,设置端口号,我们可以使用规定设置端口号的server.port
来设置:
server.port=8082
配置修改完毕后,启动程序,可以看到端口号已经设置成你配置文件所设置的端口号了。
有关更多系统的配置,了解官网的官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
注意!不要在所写的配置信息最后加空格!!!
我们知道配置文件的信息除了系统的配置,还可以自定义配置。
# 自定义配置信息
custom.name=张三
custom.id=1
那如何读取配置文件中的信息呢?读取配置文件中的信息,我们可以使用@Value注解来实现。
我们可以使用属性注入的方式来获取,当然也可以使用构造方法注入和Setter注入,我们以属性注入举例子, 获取规则:
@Value("${配置信息key}")
private String name;
样例:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UseYml {
@Value("${custom.name}")
private String name;
@Value("${custom.id}")
private String id;
@Value("${server.port}")
private String port;
@ResponseBody
@RequestMapping("/yml")
public String configuration() {
return "name:" + name + "\n"
+ "id:" + id + "\n"
+ "port:" + port;
}
}
页面获取结果:
3.2yml配置文件
3.2.1基本语法与使用
基本语法:
# :后面空格一定不能省
key: value
例如,将上述的propertise
转换成yml
格式如下:
server:
port: 8082
# 自定义配置信息
custom:
name: zhangsan
id: 1
读取yml配置文件的方式与properties配置文件一样,代码都不用变。
yml的优点:
- 语法简单,可读性高。
- 支持更多数据类型。
- 跨语言使用,Python,Go等语言都使用yml。
3.2.2yml中单双引号问题
关于yml单双引号问题:
我们将配置文件中的配置信息设置成如下字样:
mystring:
str1: 你好\n配置
str2: '你好\n配置'
str3: "你好\n配置"
我们将这些配置信息注入到一个类,我们尝试来读取它们。
@Controller
public class YmlString {
@Value("${mystring.str1}")
private String str1;
@Value("${mystring.str2}")
private String str2;
@Value("${mystring.str3}")
private String str3;
@ResponseBody
@RequestMapping("/str")
public String mystr() {
System.out.println("str1:" + str1);
System.out.println("str2:" + str2);
System.out.println("str3:" + str3);
return str1 +"\n"
+ str2 + "\n"
+ str3;
}
}
控制台输出结果:
这就说明,被双引号包裹的值,按照原语义执行,而被单引号包裹或不包裹的值会发生转义,像上面的例子就是\n
转义成了\\n
,所以就输出了\n
。
3.2.3配置对象
对于yml配置文件,还能进行对象的设置,如设置一个Student
对象:
方式1:
student:
id: 1
name: 张三
age: 18
方式2:
student: {id: 1,name: 张三,age: 18}
从配置文件读取自定义的对象,就不可以使用@Value注解来读取了,需要使用@ConfigurationProperties注解来进行对象的读取,并且对于的类必须有getter/setter
方法。
示例:
学生类:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@ConfigurationProperties(prefix = "student")
@Component
public class Student {
private int id;
private String name;
private int age;
}
使用类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ConfigController {
@Autowired
private Student student;
@RequestMapping("/student")
@ResponseBody
public String sayStu() {
System.out.println(student);
return student.toString();
}
}
运行结果:
3.2.4配置集合
配置文件还能配置集合,使用方法如下:
方式1:
dbtypes:
name:
- mysql
- sqlserver
- db2
方式2(推荐):
dbtypes: {name: [mysql, sqlserver, db2]}
获取与对象的获取方式一模一样,只是现在类里面的一个属性为集合对象。
获取示例:
与配置文件对应的对象:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@ConfigurationProperties(prefix = "dbtypes")
@Component
public class ConfigList {
private List<String> name;
}
使用类:
@Controller
public class ConfigController {
@Resource
private ConfigList configList;
@RequestMapping("/list")
@ResponseBody
public String sayList() {
System.out.println(configList.getName());
return configList.getName().toString();
}
}
运行结果:
小总结:properties与yml的区别
- 语法不同
- properties为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题。
- yml通用性更好,支持更多语言,如Java、Go、Python等,如果是云服务器开发,可以使用一份配置文件作为Java和Go的共同配置文件。
- yml虽然可以和properties共存,但一个项目中建议使用统一的配置类型文件。
- yml支持更多的数据类型,如对象和集合。
- 点赞
- 收藏
- 关注作者
评论(0)