SpringBoot设置和读取配置文件(1)

news2024/9/22 21:20:14

SpringBoot配置文件是用来保存SpringBoot项目当中所有重要的数据的,比如说数据库连接信息,数据库的启动端口,如果端口被占用了,那么就可以随时修改;

1)比如说我们之前再写JDBC的代码的时候,要去写链接字符串,用户名密码,之前保存在类里面,但是在我们的SpringBoot项目里面并不会把这些敏感的信息放到代码里面,因为如果这些信息放在JAVA代码里面是不方便进行修改的,并且只能由程序员去修改,而在公司里面技术岗位是有很多人的,假设你是开发人员或者是测试人员,最终部署到线上环境是由运维工程师部署的,所以说最终是由运维开发工程师来将你的项目部署到服务器上面,运维开发工程师不懂JAVA只懂Linux服务器,对于安全方面的知识比较多,部署项目并且能够在linux服务器上面稳定的运行,项目--->测试人员测试----->运维人员部署

2)因为Spring打成的包是jar包格式,如果你之前要是把配置信息写到一个类里面,那么最终就是.class文件,就是二进制字节码文件,字节码文件是无法进行修改的,.class只能看不能修改,所以配置文件不能写到一个类里面,这是不方便运维开发工程师进行修改的,当我们打开jar包的时候,我们点击.class文件发现一行字File is Read only,因为他是字节码不能修改,况且我们把这个.class文件用IDEA打开之后呢能够看到正常的一个JAVA代码是因为IDEA可以识别这个字节码,并且可以把字节码转化成一个相应的代码,本质上是IDEA自动进行识别的,我们把配置信息写到.class文件是不允许进行修改的,但是把配置信息写到配置文件里面,运维人员是可以进行修改的,这个时候就可以修改端口号,什么username运维人员都是认识的;

 

3)配置文件可以设置开发环境和运行环境两个配置文件,在进行运行打包的过程中通过修改一个变量是走那一套将多个配置文件共存,只需要修改一个变量,就可以走不同的配置文件

4)还可以存放三方调用的一些信息,比如说可以在学校教务系统里面可以看到一些优慕课的学习记录的,我们学校的教务系统是和有慕课是打通的,优慕课就会给学校的研发人员提供一些接口文档,那么通过这个接口文档就可以请求到我们教务系统想要的数据

 

1)整个项目中最重要的数据都是在配置文件里面进行配置的,比如说:数据库的连接信息

项目的启动端口,第三方系统的调用密钥等信息,教务系统可以看到CCTALK的一个观看直播数据,教务系统向CCTALK拉取数据的时候,就会带上一个第三方秘钥,CCTALK看到这个秘钥之后,就认为你当前身份合法,就可以拉取数据了,根据这个密钥就知道是特定人员发送过来的请求,三方的密钥也是通过配置文件来进行存储的;

2)如果没有配置文件的话,那么SpringBoot项目就不可以进行连接和操作数据库

3)甚至是不能保存用于排查问题的关键日志,所以说配置文件的作用还是非常重要的日志输出格式,日志保存路径,日志级别,可以配置日志级别还有持久化配置;

4)配置文件可以设置开发环境和配置环境两个配置文件,在进行运行打包项目的时候,就通过修改一个变量来进行指定使用哪一个配置文件,就可以从一个配置文件到另一个配置文件

SpringBoot是约定大于配置,必须遵循SpringBoot所约定的规则

1)链接数据库写法固定,必须写在配置文件里面,写在别的地方不可以

2)启动类必须和要放在SpringIOC容器Bean目录同级,或者在子包里面

3)配置文件名字是application.yml或者是appication.properties,因为SpringBoot在项目进行启动的时候,我只认名字等于applicaion开头的配置文件,改成applications就不生效了

我们SpringBoot的配置文件分为两种:

1)系统配置文件:我们已经约定好了,链接数据库字符串的Key值和Value值就是这么写不许变

2)自己定义的配置文件:自己约定好的,自己约定的键值对,像一些第三方的密钥信息,只有我们自己用,Key值是自己约定好的;

配置文件的格式:他们是属于两个版本,两个版本配置文件是可以共存的;

他们来的存在关系就是类似于@PostConstruct和init-method是一样的,都是在给Bean做初始化工作的一个是注解时期的产物,一个是XML时期的产物

1)properties:最先出现

2)yml:后来出现的

文件配置名字一定是application.properties或者是application.yml

 

1)当一个项目中既有.properties又有.yml,并且他们在两个配置文件有相同的配置项,那么SpringBoot项目配置项会使用优先级更高的.properties配置项作为最终的配置文件

2)一个项目中允许存在两种不同的配置文件properties和yml,但是强烈建议我们在一个项目中只采取一种格式的配置文件即可

3)我们尽量安装一下Spring Tools插件,安装了这个插件之后,使用咱们的properties才会有代码提示,否则是没有代码提示的,因为

4)配置的时候包括系统级别(系统配置文件)和用户级别的;

5如果说我们的properties没有提示信息,那么就需要安装spring tools插件了;

 

1)SpringBoot项目在进行启动的时候,只会认application名字的启动配置文件,你的application不能变成applications,无论是yml还是properties的文件名;

2)但是两个配置文件可以并存,也就是说在一个项目里面可以存放两种类型的配置文件,properties和yml,但是不建议这么进行使用但是说如果配置文件的信息冲突了,那么SpringBoot会优先采用properties配置文件来进行使用,yml不生效;

3)对于其他使用者来说,使用成本变高了,需要两种配置文件的格式知识都要掌握,提高开发人员的门槛了;

 application-properties是一个系统级别的配置文件

properties是配置文件最早期的配置文件的格式,也是创建SpringBoot项目默认的配置文件

1)基本语法使用是以键值的形式进行配置,Key和Value是以=进行连接的,在key和value之间不要去加空格

2)properties默认情况不支持中文,编码格式不是UTF-8,但是yml是支持中文的

3)解决方案就是:直接点击settings/new projects settings解决当前项目的乱码问题,输入encoding,选择FileEncoding,全部设置成UTF-8,我们不光要进行配置当前项目的中文乱码问题,而且还要进行配置新项目的中文乱码问题,能保证下一次创建的项目中的properties文件不乱码;

4)配置完这些编码格式的信息之后,我们就将原来的application.properties进行删除,我们可以重新再来创建一个application.properties文件,因为之前的配置文件已经是不支持中文编码的文件格式了,我们必须删除再来重新进行创建,因为设置编码在创建applicationproperties之后,以后设置的编码不会改变原来的旧的application.proiperties文件,所以说需要先将之前的配置文件删除掉再来重新进行创建,这样就避免了中文乱码问题;

5)我们可以在properties文件里面加上#是来进行表示注释信息:

格式信息:key=value,永远不要加空格,properties文件不支持中文

#配置项目端口号
#下面这个是系统的配置文件,key的值是不允许发生变化的
#两边不要设置空格,况且8084后面也不要进行设置空格,就是数字后面不要加空格
server.port=8084
spring.datasource.url=jdbc:127.0.0.1:3306/java300/?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=12503487
#自定义配置文件,key的值可以发生任意改变
cctalk.token=XXX
MyCCtalk.token=XXX
YMK.token=9090

1)对于一个对象的多个参数进行设置是很麻烦的,需要从一开始进行写起直到一直写到结束为止,他是有很多的冗余的配置项的

2)教务系统后台调用了有慕课为我们提供的API接口,咱们就可以进行查询到每一位同学的学习情况,录屏看了多长时间(教务系统里面配置文件里面有密钥);

 我们先不要管红线,第一种写法尽量不要这么写,因为这个配置文件读取的时候很有可能会把value本来是8080读取成了空格+8080,这就比较蛋疼了,下面是在后面加了空格不容易发现,在数字后面加了空格;

这种写法也是错误的所以说写properties配置文件的时候键值对永远不要加空格;

SpringBoot在类里面读取配置文件(properties)的方法:

@Value("${变量名.属性}")

到了SpringBoot时代基本上所有的功能都是可以依靠注解来搞定,使用Value注解是一样的

1)当我们进行成功的配置了系统的文件之后,我们直接在启动的main方法里面所实现的类上面实现InitializingBean接口,重写里面的afterPropertiesSet方法,就是说当我们系统文件配置完成之后,就会执行到这个方法;

2)注意value只能读取单个配置项;

使用@Value注解读取某个单个配置项(千万不要漏掉$和括号),${Key}这么写才可以读到正确的配置项,不写$或者大括号虽然不会报错但是也是无法正确的读取到;

最终读写到的是一个英文单词而不是配置信息

 

@Value("${server.port}")//读取配置文件,我们在application.properties
里面进行根据Value注解中的Key读取到Value的值并赋值给str
	private String str;

@Value("${cctalk.token}")
private String str;

    @RequestMapping("/java100")
    @ResponseBody
    public String run(String name)
    {
        return name+str;
    }

了解:我们也是可以通过@Value注解来读取单个配置项的;

 

 

总结Properties的缺点分析:

从上面的配置Key可以看出,properties配置文件里面会包含很多的冗余的信息,再三条信息中都写了spring.datasource这是十分的不方便的,如果相同项有很多,写法就会非常复杂;

如果说我想要在配置文件里面进行设置MYSQL里面的三个链接,进行设置得十分麻烦

同时我们也发现,对于一个对象的多个参数的多个设置写起来是很麻烦的,要从一开始写到结束为止;

二.yml配置文件

1)yml可以简单表示数据序列化的形式,可以简单的表示清单,数组,散列表,标量等数据形态,它使用空白符号缩进和大量依赖于外观的特色,特别适用于各种配置文件;

2)语法形式:key+":"+空格+具体的键值(value),yml最大的方式就是可以跨语言,很多语言都可以用yml作为配置文件,可以支持中文,注意中间的空格是不可以省略的;

 

 

 读取yml单个配置文件的方式和之前读取properties读取单个配置项的方法就是一样的

@Value("${父亲类.子类属性}")
private String 对应的类型

 

 

 我们再进行演示一段yml形式的代码:

myvalue:
  val1: Hello \n Value
  val2: 'Hello \n Value'
  val3: "hello \n Value"
    @Value("${myvalue.val1}")
	 private String val1;
     @Value("${myvalue.val2}")
	 private String val2;
     @Value("${myvalue.val3}")
	 private String val3;

最后我们进行打印出来的结果是:

Hello \n Value
Hello \n Value
hello 
Value

yml:yml中如果使用了双引号就会按照原语义进行执行,如果不加上单双引号,或者加上了单引号,那么会自动默认按照特殊字符进行转义,比如\n,不会自动换行

 

 上面的解析结果是一样的

1)String.value3: "我想上天\\n"
2)@Value("${String.value3}")
    private String value3;
3)我想上天\n

一)读取yml文件配置对象和读取:

当我们想要读取一个对象的时候,我们就不能再通过@Value注解来进行读取配置中的对象了,此时我们就只能通过另一个注解也就是@ConfigurationProperties来进行读取了:

一:将配置文件中的一组对象映射到某个类上面,我们在这里面要使用到两个必不可少的注解@Component和@ConfigurationProperties("类名对应着Key");

二:使用其他注入方式在其它类中注入这个类即可(使用属性注入,Setter注入或者构造方法进行注入都是可以的

我们在resource目录下进行创建"xxx.yml"文件

key:+空格+Value-----这个空格是不能少的

1)我们在application.yml里面写的代码:
student:
  id: 1
  name: 李佳伟
  age: 16
2)我们在一个Student类里面写的代码
@Component//我们在Spring进行启动的时候直接将配置文件映射到当前类中的属性
@ConfigurationProperties("student")//我们也是可以这么写,这里面的写的值一定要和配置文件中的key的值是相同的:@ConfigurationProperties(prefix="student");
public class Student {
    private int id;
    private int age;
    private String name;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
3)我们在main方法里面进行注入Student类
@SpringBootApplication
public class DemoApplication implements InitializingBean {
     @Autowired
     private Student student;
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	public void afterPropertiesSet() throws Exception {
		System.out.println(student);
	}
}

读取配置文件对象的方式:不可以通过@Value来进行读取

我们在写application.yml的文件的时候,里面写的键值对的形式可以写成一行,她也叫作对象的行内写法:

Student:
  UserID: 1
  UserName: 李佳伟 #字符串类型不需要加上双引号,SpringBoot会自动帮我们进行处理
  PassWord: 12503487
#这个时候我们就不可以通过@Value来进行读取配置中的对象了,而是通过别的注解@ConfigurationProperties来进行读取
#下面是行内写法,况且天然支持中文
Teacher: {TeacherID: 1,TeacherName: 李佳伟,TeacherAge: 10}

Student里面的代码:

@ConfigurationProperties(prefix = "student")
@Component//让咱们的Spring项目一进行启动就要读取配置文件,解析成一个对象加入到Spring容器里面,后续就可以通过以来注入的方式来进行使用
@Data//是通过Get方法来去读配置文件,通过Set方法将配置文件的属性填充到这个类里面
public class Student {
    private int UserID;
    private String UserName;
    private String PassWord;
}

2)读取yml文件配置集合的处理

配置集合:多个元素之间使用-加上空格来进行分割的

我们集合的读取和对象的读取是一样的,也是使用@ConfigurationProperties来进行读取的

@Component
@ConfigurationProperties("mylist")
@Data
public class ReadList {
//我们在这里面一定要注意两件事情:
//1这里面的注解有两个,一个是Component注解
//2还有一个注解是ConfigurationProperties,里面的值一定要和我们的
//yml的第一级的配置目录是相同的
//3我们此时期望使用一个list数组来进行接收,此时list数组的变量名要和
//yml的二级文件配置路径要相同
//4此时的Getter和Setter方法一定是不能够丢的
    private List<String> colors;
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C 字符串

在 C 语言中&#xff0c;字符串实际上是使用空字符 \0 结尾的一维字符数组。因此&#xff0c;\0 是用于标记字符串的结束。空字符&#xff08;Null character&#xff09;又称结束符&#xff0c;缩写 NUL&#xff0c;是一个数值为 0 的控制字符&#xff0c;\0 是转义字符&#…

SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件

文章目录1.前置环境搭建2.测试SNI生效条件(时间)3. 证书对SNI的影响3.1 双方使用同一个证书&#xff1a;3.2 双方使用不同的证书与私钥4. 端口号区分测试4.1 端口号区分&#xff0c;证书区分&#xff1a;4.2 端口号区分,证书不区分&#xff1a;5.总结SNI运行机制6. SNI机制绕过…

Docker-安装Jenkins-使用jenkins发版Java项目

文章目录0.前言环境背景1.操作流程1.1前期准备工作1.1.1环境变量的配置1.2使用流水线的方式进行发版1.2.1新建流水线任务1.2.2流水线操作工具tools步骤stages步骤1:拉取代码编译步骤2:发送文件并启动0.前言 学海无涯&#xff0c;旅“途”漫漫&#xff0c;“途”中小记&#xff…

从0到1一步一步玩转openEuler--12 openEuler用户管理

文章目录12.1 创建用户12.1.1 useradd命令12.1.2 用户信息文件12.1.3 创建用户实例12.2 修改用户账号12.2.1 修改密码12.2.2 修改用户shell设置12.2.3 修改主目录12.2.4 修改UID12.2.5 修改账号的有效期12.3 删除用户12.4 管理员账户授权在Linux中&#xff0c;每个普通用户都有…

【Java 面试合集】怎么声明一个类不会被继承,以及应用场景

怎么声明一个类不会被继承&#xff0c;以及应用场景1. 概述 今天的Java 面试合集又来了。今天我们复习的问题是:怎么声明一个类&#xff0c;不可以被继承 2. 验证 public final class TestMath { }通过上述截图 我们可以看到&#xff0c;被关键字final 修饰过的类&#xff0c;…

EOC第六章《块与中枢派发》

文章目录第37条&#xff1a;理解block这一概念第38条&#xff1a;为常用的块类型创建typedef第39条&#xff1a;用handler块降低代码分散程度第41条&#xff1a;多用派发队列&#xff0c;少用同步锁方案一&#xff1a;使用串行同步队列来将读写操作都安排到同一个队列里&#x…

02 OpenCV图像通道处理

1 通道提取与合并 在数字图像处理中&#xff0c;图像通道是指一个图像中的颜色信息被分离为不同的颜色分量。常见的图像通道包括RGB通道、灰度通道、HSV通道等。 RGB通道是指将图像分离为红色、绿色和蓝色三个颜色通道&#xff0c;每个通道表示相应颜色的亮度。这种方式是最常…

【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】

【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】1、概述2、实验环境3、参考资料-致谢4、自我提升实验效果5、代码练习-学习后拆解&#xff08;1&#xff09;头文件部分&#xff08;2&#xff09;绘制事件绘制表盘代码&#xff08;3) 每一块部分绘制6、代码移植提升类…

Spring Security in Action 第十一章 SpringSecurity前后端分离实战

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…

nginx正向代理的配置和使用

nginx正向代理的配置和使用 nginx正向代理的配置和使用nginx正向代理的配置和使用安装包准备下载nginx安装包下载正向代理模块的包版本与模块对照表部署nginx服务上传nginx包和正向模块包解压,改名安装nginx配置正向代理创建nginx用户检查nginx配置并启动nginx服务所在服务器验…

微服务02 Docker

Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0…

实战绕过WTS-WAF的SQL注入

实战绕过WTS-WAF的SQL注入1.前言2.测试流程2.1.发现漏洞2.1.1.正常页面2.1.2.WAF警告2.1.3.非正常页面2.2.判断字段数2.2.1.非正常页面2.2.2.正常页面2.3.判断回显位2.4.信息收集2.4.1.数据库版本2.4.2.数据库名2.5.判断数据库表2.5.1.WAF告警2.5.2.获取表2.5.3.burp suite测试…

龙曲良 Tensorflow —— tensorflow高级操作(自用)

目录 一、合并与分割 1.1 tf.concat (合并) 1.2 tf.stack &#xff08;增加新维度&#xff09; 1.3 tf.unstack &#xff08;一个一个拆分&#xff09; 1.4 tf.split &#xff08;均分拆分&#xff09; 二、数据统计 2.1 tf.norm&#xff08;默认二范数&#xff09; 2…

WebRTC(一):三种架构和基本原理

文章目录一、三种架构二、为什么SFU最为常用&#xff1f;一、三种架构 webrtc大致可以分为三种架构&#xff1a; MESH mesh架构需要所有参与连接的peer简历和所有其他peer的媒体的连接&#xff0c;如图一。 该架构需要n-1个上下行&#xff0c;以此带来的带宽消耗&#xff08…

家政服务小程序实战教程02-创建模型应用

我们在上一篇中介绍了数据源的设计及创建方法&#xff0c;本篇我们就根据我们创建好的数据源来设计功能。 按我们的需求分析&#xff0c;系统管理员来审核数据&#xff0c;要想审核数据需要给管理员提供一个管理后台。微搭中的管理后台是通过模型应用来解决的。 登录控制台&a…

我用python/C++调用ChatGPT自制了一个聊天机器人

目录1 ChatGPT完整版2 Python/C调用ChatGPT2.1 获取API秘钥2.2 测试API功能2.3 设计简单UI3 聊天问答1 ChatGPT完整版 2015年&#xff0c;OpenAI由马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得蒂尔等硅谷科技大亨创立&#xff0c;公…

chatGPT都可以干什么呢?来一睹风采 (送账号)

文章目录1. 写代码2. 写文案3. 写剧本4. 写歌诗5. 写报告6. 查公式7. 写对联8. 写文章9. 做表格10. 做计划11. 等等1. 写代码 2. 写文案 3. 写剧本 4. 写歌诗 5. 写报告 这妥妥的翻译文&#xff0c;数据完全不对。 6. 查公式 傅里叶变换的时域性质有如下几点&#xff1a; 对…

JAVA集合专题4 —— Map

目录Map接口实现类的特点Map接口的常见方法Map六大遍历方式Map练习1code编程练习2code编程练习3思路codeMap接口实现类的特点 Map与Collection并列存在&#xff0c;是Map集合体系的顶级接口Map的有些子实现存储数据是有序的(LinkedHashMap)&#xff0c;有些子实现存储数据是无…

【量化交易】 量化因子 动量类因子

量化因子 - 风险类因子计算 5日乖离率 BIAS5 &#xff08;收盘价-收盘价的N日简单平均&#xff09;/ 收盘价的N日简单平均*100&#xff0c;在此n取5 60日变动速率&#xff08;Price Rate of Change&#xff09; ROC60 ①AX今天的收盘价—20天前的收盘价 ②BX60天前的收盘价 ③…

React-Router

版本5安装&#xff1a;npmnpm install react-router-dom5 -Syarnyarn add react-router-dom5import ReactDOM from "react-dom/client";// react router适用于web和原生项目&#xff0c;我们在web项目中使用&#xff0c;所以需要引入的包是react-router-dom import {…