一)配置文件的作用:
SpringBoot项目中的所有的重要的数据都是在配置文件中配置的,SpringBoot配置文件是用来保存SpringBoot项目当中所有重要的数据的,比如说数据库连接信息,数据库的启动端口,如果端口被占用了,那么就可以随时修改;
1)数据库的连接信息:
比如说之前再写JDBC的代码的时候,要去写链接字符串,用户名密码,之前保存在类里面,但是在我们的SpringBoot项目里面并不会把这些敏感的信息放到代码里面,因为如果这些信息放在JAVA代码里面是不方便进行修改的,并且只能由程序员去修改,而在公司里面技术岗位是有很多人的,假设你是开发人员或者是测试人员,最终部署到线上环境是由运维工程师部署的,所以说最终是由运维开发工程师来将你的项目部署到服务器上面,运维开发工程师不懂JAVA只懂Linux服务器,对于安全方面的知识比较多,部署项目并且能够在linux服务器上面稳定的运行,项目,测试人员测试,运维人员部署;
因为Spring打成的包是jar包格式,如果你之前要是把配置信息写到一个类里面,那么最终就是.class文件,就是二进制字节码文件,字节码文件是无法进行修改的,.class只能看不能修改,所以配置文件不能写到一个类里面,这是不方便运维开发工程师进行修改的,当我们打开jar包的时候,我们点击.class文件发现一行字File is Read only,因为他是字节码不能修改,况且我们把这个.class文件用IDEA打开之后呢能够看到正常的一个JAVA代码是因为IDEA可以识别这个字节码,并且可以把字节码转化成一个相应的代码,本质上是IDEA自动进行识别的,我们把配置信息写到.class文件是不允许进行修改的,但是把配置信息写到配置文件里面,运维人员是可以进行修改的,这个时候就可以修改端口号,什么username运维人员都是认识的;
2)项目的启动端口:
3)第三方的调用密钥等信息:
还可以存放三方调用的一些信息,比如说可以在学校教务系统里面可以看到一些优慕课的学习记录的,我们学校的教务系统是和有慕课是打通的,优慕课就会给学校的研发人员提供一些接口文档,那么通过这个接口文档就可以请求到我们教务系统想要的数据
整个项目中最重要的数据都是在配置文件里面进行配置的,比如说:数据库的连接信息
项目的启动端口,第三方系统的调用密钥等信息,教务系统可以看到CCTALK的一个观看直播数据,教务系统向CCTALK拉取数据的时候,就会带上一个第三方秘钥,CCTALK看到这个秘钥之后,就认为你当前身份合法,就可以拉取数据了,根据这个密钥就知道是特定人员发送过来的请求,三方的密钥也是通过配置文件来进行存储的;
4)便于修改配置信息:
配置文件可以设置开发环境和运行环境两个配置文件,在进行运行打包的过程中通过修改一个变量是走那一套将多个配置文件共存,只需要修改一个变量,就可以走不同的配置文件
1)如果没有配置文件的话,那么SpringBoot项目就不可以进行连接和操作数据库
2)甚至是不能保存用于排查问题的关键日志,所以说配置文件的作用还是非常重要的日志输出格式,日志保存路径,日志级别,可以配置日志级别还有持久化配置;
3)配置文件可以设置开发环境和配置环境两个配置文件,在进行运行打包项目的时候,就通过修改一个变量来进行指定使用哪一个配置文件,就可以从一个配置文件到另一个配置文件
SpringBoot是约定大于配置,必须遵循SpringBoot所约定的规则
1)链接数据库写法固定,必须写在配置文件里面,写在别的地方不可以
2)启动类必须和要放在SpringIOC容器Bean目录同级,或者在子包里面
3)配置文件名字是application.yml或者是appication.properties,因为SpringBoot在项目进行启动的时候,我只认名字等于applicaion开头的配置文件,改成applications就不生效了
配置文件的分类:
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)对于其他使用者来说,使用成本变高了,需要两种配置文件的格式知识都要掌握,提高开发人员的门槛了;
4)properties配置文件是可以和yml配置文件存在于同一个项目中的,yml文件相比于properties文件做了一些优化,比如说yml文件天然支持中文字符,但是properties天然不支持中文字符,如果不进行字符配置,很有可能就会出现乱码现象;
三)配置文件的使用:
3.1)properties配置文件的使用:
3.1.1)基本语法的使用:
1)properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件
2)基本语法使用是以键值的形式进行配置,Key和Value是以=进行连接的,在key和value之间不要去加空格,可以在properties文件里面加上#是来进行表示注释信息
3)properties默认情况不支持中文,编码格式不是UTF-8,但是yml是支持中文的,直接点击settings/new projects settings解决当前项目的乱码问题,输入encoding,选择FileEncoding,全部设置成UTF-8,不光要进行配置当前项目的中文乱码问题,而且还要进行配置新项目的中文乱码问题,能保证下一次创建的项目中的properties文件不乱码;
配置完这些编码格式的信息之后,就将原来的application.properties进行删除,我们可以重新再来创建一个application.properties文件,因为之前的配置文件已经是不支持中文编码的文件格式了,必须删除再来重新进行创建,因为设置编码在创建applicationproperties之后,以后设置的编码不会改变原来的旧的application.proiperties文件,所以说需要先将之前的配置文件删除掉再来重新进行创建,这样就避免了中文乱码问题;
4)但是对于一个对象的多个参数进行设置是很麻烦的,需要从一开始进行写起直到一直写到结束为止,他是有很多的冗余的配置项的
#配置项目端口号 #下面这个是系统的配置文件,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
5)教务系统后台调用了有慕课为我们提供的API接口,咱们就可以进行查询到每一位同学的学习情况,录屏看了多长时间(教务系统里面配置文件里面有密钥);
6)先不要管红线,第一种写法尽量不要这么写,因为这个配置文件读取的时候很有可能会把value本来是8080读取成了空格+8080,这就比较蛋疼了,下面是在后面加了空格不容易发现,在数字后面加了空格,这种写法也是错误的所以说写properties配置文件的时候键值对永远不要加空格;
3.1.2)读取properties中配置文件的信息:
@Value("${变量名.属性}") 要注意${}不能省略 @Value("${配置信息key}") private String username;
到了SpringBoot时代基本上所有的功能都是可以依靠注解来搞定,使用Value注解是一样的
1)当进行成功的配置了系统的文件之后,我们直接在启动的main方法里面所实现的类上面实现InitializingBean接口,重写里面的afterPropertiesSet方法,就是说当我们系统文件配置完成之后,就会执行到这个方法;
2)注意value只能读取单个配置项;
3)使用@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; }
4)也是可以通过@Value注解来读取yml单个配置项的
总结Properties的缺点分析:写法非常冗余和臃肿
1)从上面的配置Key可以看出,properties配置文件里面会包含很多的冗余的信息,再三条信息中都写了spring.datasource这是十分的不方便的,如果相同项有很多,写法就会非常复杂
2)如果说想要在配置文件里面进行设置MYSQL里面的三个链接,进行设置得十分麻烦
同时我们也发现,对于一个对象的多个参数的多个设置写起来是很麻烦的,要从一开始写到结束为止;
3.2)yml配置文件:
yml是树形配置文件,特别需要注意的是key和value之间要使用冒号加空格,空格一定不可以省略
1)yml可以简单表示数据序列化的形式,可以简单的表示清单,数组,散列表,标量等数据形态,它使用空白符号缩进和大量依赖于外观的特色,特别适用于各种配置文件;
2)语法形式:key+":"+空格+具体的键值(value),yml最大的方式就是可以跨语言,很多语言都可以用yml作为配置文件,可以支持中文,注意中间的空格是不可以省略的;
读取yml单个配置文件的方式和之前读取properties读取单个配置项的方法就是一样的
@Value("${父亲类.子类属性}") private String 对应的类型
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
1)加单引号和没加是一样的,加了双引号才会对\n换行
2)加了单引号或者啥也不加使用\n不会自动换行,使用\\才可以完成换行
而被单引号包裹值(特殊字符)会发生转义,像上面的例子就是
\n
转义成了\\n
,所以就输出了\n
,最终就只是一个普通的字符串,至于不加双引号的输出结果是因为 yml 中字符串默认是不加引号的,就直接输出了3.2.1)文件配置对象的读取:
当想要读取一个对象的时候,就不能再通过@Value注解来进行读取配置中的对象了
此时就只能通过另一个注解也就是@ConfigurationProperties来进行读取了:
yml配置文件中对象的两种写法:
a)树形写法:
user: userID: 10 username: 张三 password: 123456
b)行内写法:
user: {userID: 1,name: zhangsan,age: 10}
Student: UserID: 1 UserName: 李佳伟 #字符串类型不需要加上双引号,SpringBoot会自动帮我们进行处理 PassWord: 12503487 #这个时候我们就不可以通过@Value来进行读取配置中的对象了,而是通过别的注解@ConfigurationProperties来进行读取 #下面是行内写法,况且天然支持中文 Teacher: {TeacherID: 1,TeacherName: 李佳伟,TeacherAge: 10}
一)将配置文件中的一组对象映射到某个类上面,在这里面要使用到两个必不可少的注解@Component和@ConfigurationProperties("类名对应着Key");
二)使用其他注入方式在其它类中注入这个类即可(使用属性注入,Setter注入或者构造方法进行注入都是可以的
三)需要使用
@ConfigurationProperties
注解来进行对象的读取,并且对应的类必须有getter和setter
方法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); } }
@ConfigurationProperties(prefix = "student") @Component//让咱们的Spring项目一进行启动就要读取配置文件,解析成一个对象加入到Spring容器里面,后续就可以通过以来注入的方式来进行使用 @Data//是通过Get方法来去读配置文件,通过Set方法将配置文件的属性填充到这个类里面 public class Student { private int UserID; private String UserName; private String PassWord; }
3.2.2)读取yml文件配置集合的处理
配置集合:多个元素之间使用-加上空格来进行分割的,还是有树形写法和行内写法
集合的读取和对象的读取是一样的,也是使用@ConfigurationProperties来进行读取的
@Component @ConfigurationProperties("mylist") @Data public class ReadList { //我们在这里面一定要注意两件事情: //1这里面的注解有两个,一个是Component注解 //2还有一个注解是ConfigurationProperties,里面的值一定要和我们的 //yml的第一级的配置目录是相同的 //3我们此时期望使用一个list数组来进行接收,此时list数组的变量名要和 //yml的二级文件配置路径要相同 //4此时的Getter和Setter方法一定是不能够丢的 private List
colors; } 注意:集合的第一级和ConfigurationProperties中的prefix前缀名字是相同的,集合的第二级路径是和变量名是相同的
四)properties和yml有什么区别?
2.1)properties和yml都是SpringBoot支持的两种配置文件,他们都是可以看作是SpringBoot在不同时期的两种产品,在SpringBoot时代我们已经不需要XML文件格式来配置项目了,取而代之的是properties和yml文件;
2.2)properties配置文件属于早期的,也就是目前创建的SpringBoot(2.X)的项目默认的配置文件格式,但是yml是可以看作是properties文件的升级版,属于SpringBoot的新型配置文件
所以说我们可以把yml配置文件是可以看作properties配置文件的升级版
1)定义和定位不同:
proiperties翻译成中文是属性的意思,所以是他在创建之初就是给SpringBoot来设置属性的,yml是Yaml的缩写,翻译成中文是另一种标记语言,所以说他们的定位和层次是完全不同的properties是用来设置一些属性配置的,但是yml的格局和愿景是更大的,它的定位是另一种标记语言,所以说从格局上来看,yml就比properies大;
2)语法不同:yml的语法更简单可读性更高
properties的语法格式类似于:key=value,所有地方都是不可以多加空格的
但是yml的基本语法是key:空格value,况且冒号后面的空格是不能省略的,否则项目启动的时候会报错;
3)支持的数据类型不同:yml可以配置更多的数据类型,比如说对象和集合
yml除了支持配置基础数据类型之外,还可以很方便地配置对象,集合等数据类型
2.1)在yml中配置对象等数据类型:
student: id: 1 name: java age: 18
2.2)在yml使用行内写法配置对象等数据类型:
teacher: {id: 1,name: java,age: 18}
2.3)集合等数据类型
#1.设置一个list集合 mylist: colors: - RED - GREEN - BLACK #2.设置一个list集合,行内写法 mylist: { colors:[RED,GREEN,BLACK] }
animal: - dog - cat person: [teacher, student]
4)yml可以跨语言,properties不能跨语言,yml的通用性更好
properties类型的配置文件只是适用于SpringBoot项目,也就是JAVA类型的语言,但是yml,是支持更多的开发语言,python,Golang等语言等等
假设在一家公司里面有着不同语言的开发团队,并且使用了配置中心,在线配置文件的情况下,那么不同的语言的开发团队就可以使用同一份配置文件了,也是方便后期的管理和维护
五)SpringBoot有哪些读取配置文件的方式:
先通过在SpringBoot配置文件里面写几个配置项在application.properties里面
一)使用单个配置项@value来读取配置文件:
二)使用ConfigurationProperties来读取配置文件
@ConfigurationProperties 和 @Value 的使用略微不同,@Value是读取单个配置项的,但是@ConfigurationProperties是读取一组配置项的,可以使用@ConfigurationProperties加上实体类来读取一组配置项,如下面的代码所示:
1)在类中我们要在实体类上面设置@Getter和@Setter还有@ToString
2)要把这个实体类注册到SpringIOC容器里面就要加上五大类注解
3)要在@ConfigrationProperties里面加上prefix前缀,就是我们使用prefix来读取一组配置项的根spring.user,相当于是java中的类名,最后再将此类注册到某一个类中,也就是通过属性注入的方式注册到某一个类中,就可以使用了;
prefix是第一级路径,如果是数组集合,那么变量名是第二级路径
三)使用@Environment 读取配置文件
Environment是SpringCore中用于读取配置文件的一个类,将此类使用@Autowried注册到一个类中就可以读取配置文件了,并且通过使用getProperty方法来读取配置文件里面的值
四:使用@PropertySource读取配置文件
4.1)我们使用@PropertySource注解可以用来指定读取某一个配置文件,比如说读取applicationProperties配置文件里面的内容,它是和@Value注解或者其他注解一起来进行搭配使用的:
4.2)如果配置文件中出现中文乱码的情况,可通过指定编码格式的方式来解决中文乱码的问题,具体实现如下:
@PropertySource(value = "dev.properties", encoding = "utf-8")
4.3)@PropertySource 注解默认是只支持 properties 格式配置文件的读取的
总结:
1)如果读取某一个配置项可使用 @Value
2)如果读取一组配置项可使用 @ConfigurationProperties
3)如果要指定读取某一个具体的配置文件可使用 @PropertySource 来指定
SpringBoot读取配置文件的方式:
1)通过@Value读取单个配置项
2)通过@Configuration来进行读取一组配置项,咱们要在实体类中加上@Component,@Data,还有@ConfigurationProperties(类名),咱们可以在这个注解前面加上prefix属性,就类似于Java中的类名,我们最后再把一个配置类注册到一个类中来进行使用
3)通过注入Environment类来进行读取配置文件,通过getProperty的方法来进行读取配置文件
@Controller public class UserController{ @Autowired private Environment environment; @RequestMapping("/Java") @ResponseBody public String run(){ return environment.getProperty("spring.datasource.url");//在里面输入key的名字 } }
1)PropertySource来进行读取配置文件的时候,里面可以进行指定读取哪一个配置文件
2)@propertSource(value="配置文件的名字.properties",encoding=utf-8),它是默认情况下只支持properties文件类型的读取的
六)设置不同环境的配置文件:
在日常开发中,通常使用至少三个不同的环境,开发环境,测试环境和生产环境,每一个环境的配置都不相同,包括数据库,IP地址和端口号等信息,那么该如何发现这些环境并进行打包呢?
application-dev.properties
application-test.properties
application-pro.properties
需要注意的是配置文件的命名必须遵守application-name.properties或者是application-name.yml的格式,其中的name可以程序员自己进行自定义来区分不同的环境,所以在震哥哥项目中需要有四个配置文件,主配置文件是必须存在的和三个不同环境的配置文件
此时在进行创建了各个环境的配置条件下,还需要告诉SpringBoot你要运行哪一个环境,主要有两种指定方式:
方法1:可以在主配置文件中application.properties或者是application.yml中进行指定,内容如下,此时SpringBoot会默认先加载appication.properties文件,而这个全局的配置文件又告诉SpringBoot去找指定环境的配置文件:
#指定运行环境是测试环境: spring.profiles.active=test #指定运行环境是生产环境: spring: profiles: active: test
方式2:运行jar的时候指定:
java -jar xxx.jar --spring.profiles.active=test