• SpringBoot中幕——配置文件properties与yml


    ⭐️前面的话⭐️

    本篇文章将介绍有关SpringBoot的配置文件,SpringBoot的配置文件格式有两种,一种是项目中默认生成的properties文件,另外一种就是yml格式的配置文件,yml文件可以理解为properties文件的升级版,yml语法没有properties语法那么沉余,并且更通用。

    小贴士:博主推荐->学习面试刷题必用工具

    📒博客主页:未见花闻的博客主页
    🎉欢迎关注🔎点赞👍收藏⭐️留言📝
    📌本文由未见花闻原创,CSDN首发!
    📆首发时间:🌴2022年8月7日🌴
    ✉️坚持和努力一定能换来诗与远方!
    💭推荐书籍:📚《SpringBoot实战》
    💬参考在线编程网站:🌐牛客网🌐力扣
    博主的码云gitee,平常博主写的程序代码都在里面。
    博主的github,平常博主写的程序代码都在里面。
    🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!



    注意事项:博主安利一款刷题面试的神器,如果有小伙伴还没有注册牛客,可以点击下方链接进行注册,注册完就能立即刷题了。不仅是刷题,上面还有很多有关就业的面经,面试题库,以及名企的模拟面试,我非常推荐它,博主自己用的也很多,也刷了不少题了!下图可以作证:
    1

    注册地址:牛客网

    1

    有关任何问题都可以与博主交流,你可以在评论区留言,也可以私信我,更可以加上博主的vx与博主一对一交流(文章最下方有)。

    封面区


    1.配置文件的作用

    整个项目中所有重要的数据都是在配置文件中配置的,比如∶

    • 数据库的连接信息(包含用户名和密码的设置);
    • 项目的启动端口;
    • 第三方系统的调用秘钥等信息;
    • 用于发现和定位问题的普通日志和异常日志,
    • 还可以自定义配置,如配置上传文件的保存地址信息等。

    想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。

    配置文件分为两类与,一类是系统配置文件,这种配置的格式都是固定的,另外一种是用户自定义配置文件,用户可以随意地规定配置文件的格式。

    2.配置文件格式

    SpringBoot项目配置文件有两种,一种是出生较早的properties文件,还有另外一种比较新的yml文件。

    2

    其实properties文件与yml文件就是一个老实与新式的关系,就像小米6与小米12之间的关系一样,yml文件相比于properties文件做了一些优化,如yml文件天然支持中文字符,而properties文件默认是不支持中文字符的,如果不进行字符配置,输入中文字符就会乱码。

    如何配置properties文件默认字符编码呢?过程如下图:
    12
    当然,和配置国内源一样,还需要对新建项目设置做出相同的设置。
    13
    设置完成,记得把原来的那个配置文件删除,重新新建一个,毕竟已经存在的配置文件格式的编码仍然不是UTF8。

    配置文件是存在与resources目录下的,对于SpringBoot项目默认的配置文件,配置文件名必须是application,即application.propertiesapplication.yml文件,如果配置文件名不为application那就不能够被识别。

    application.propertiesapplication.yml两个文件共存是,老式配置文件优先,也就是application.properties生效。

    3.配置文件的使用方法

    先介绍一个小插件,如果是IDEA专业版可以忽略,对于社区版IDEA来说,默认是没有配置文件的代码提示的,我们安装一个插件来提高我们的开发效率。

    这款插件名字叫做spring tools,在IDEA插件安装页面搜索安装就行,毕竟在我之前的文章已经演示很多次如何安装第三方插件了,这里就不细说了。

    当然,专业版的IDEA自带,不需要安装额外的插件。

    3.1properties配置文件

    基本语法:

    # key与=与value之间不要加空格
    key=value
    
    • 1
    • 2

    栗子,设置端口号,我们可以使用规定设置端口号的server.port来设置:

    server.port=8082
    
    • 1

    配置修改完毕后,启动程序,可以看到端口号已经设置成你配置文件所设置的端口号了。
    3

    有关更多系统的配置,了解官网的官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

    注意!不要在所写的配置信息最后加空格!!!

    我们知道配置文件的信息除了系统的配置,还可以自定义配置。

    # 自定义配置信息
    custom.name=张三
    custom.id=1
    
    • 1
    • 2
    • 3

    那如何读取配置文件中的信息呢?读取配置文件中的信息,我们可以使用@Value注解来实现。

    我们可以使用属性注入的方式来获取,当然也可以使用构造方法注入和Setter注入,我们以属性注入举例子, 获取规则:

    @Value("${配置信息key}")
    private String name;
    
    • 1
    • 2

    样例:

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    页面获取结果:
    111

    3.2yml配置文件

    3.2.1基本语法与使用

    基本语法:

    # :后面空格一定不能省
    key: value
    
    • 1
    • 2

    例如,将上述的propertise转换成yml格式如下:

    server:
      port: 8082
    
    # 自定义配置信息
    custom:
      name: zhangsan
      id: 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    读取yml配置文件的方式与properties配置文件一样,代码都不用变。

    yml的优点:

    • 语法简单,可读性高。
    • 支持更多数据类型。
    • 跨语言使用,Python,Go等语言都使用yml。

    3.2.2yml中单双引号问题

    关于yml单双引号问题:
    我们将配置文件中的配置信息设置成如下字样:

    mystring:
      str1: 你好\n配置
      str2: '你好\n配置'
      str3: "你好\n配置"
    
    • 1
    • 2
    • 3
    • 4

    我们将这些配置信息注入到一个类,我们尝试来读取它们。

    @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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    控制台输出结果:
    2
    这就说明,被双引号包裹的值,按照原语义执行,而被单引号包裹或不包裹的值会发生转义,像上面的例子就是\n转义成了\\n,所以就输出了\n

    3.2.3配置对象

    对于yml配置文件,还能进行对象的设置,如设置一个Student对象:

    方式1:

    student:
      id: 1
      name: 张三
      age: 18
    
    • 1
    • 2
    • 3
    • 4

    方式2:

    student: {id: 1,name: 张三,age: 18}
    
    • 1

    从配置文件读取自定义的对象,就不可以使用@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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用类:

    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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果:
    333

    3.2.4配置集合

    配置文件还能配置集合,使用方法如下:

    方式1:

    dbtypes:
    	name:
    		- mysql
    		- sqlserver
    		- db2
    
    • 1
    • 2
    • 3
    • 4
    • 5

    方式2(推荐):

    dbtypes: {name: [mysql, sqlserver, db2]}
    
    • 1

    获取与对象的获取方式一模一样,只是现在类里面的一个属性为集合对象。

    获取示例:
    与配置文件对应的对象:

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用类:

    @Controller
    public class ConfigController {
        @Resource
        private ConfigList configList;
        @RequestMapping("/list")
        @ResponseBody
        public String sayList() {
            System.out.println(configList.getName());
            return configList.getName().toString();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    555


    小总结:properties与yml的区别

    • 语法不同
    • properties为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题。
    • yml通用性更好,支持更多语言,如Java、Go、Python等,如果是云服务器开发,可以使用一份配置文件作为Java和Go的共同配置文件。
    • yml虽然可以和properties共存,但一个项目中建议使用统一的配置类型文件。
    • yml支持更多的数据类型,如对象和集合。

    下期预告:SpringBoot日志

    到文章最后,再来安利一下吧,博主也是经常使用,并且也经常在牛客上刷题,题库也非常丰富:学习,刷题,面试,内推都有。也欢迎与博主交流有关刷题,技术方面,以及与博主聊聊天,交个朋友也好啊,毕竟有朋自远方来!

    觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

    1-99

  • 相关阅读:
    http请求报头header
    抢滩未来 音视频引领新趋势
    面试算法2:二进制加法
    Linux 运维工程师面试真题-3-Linux 磁盘及软件管理操作
    汇聚荣拼多多电商好不好?
    Qt开发 入门
    循环神经网络RNN
    小程序Springboot基层慢性病信息管理系统毕业设计-附源码221550
    FPGA刷题——数据位宽转换(整数倍&非整数倍)
    CV计算机视觉每日开源代码Paper with code速览-2023.11.3
  • 原文地址:https://blog.csdn.net/m0_59139260/article/details/125992263