00:00
好,我们来说第二小节,外部化配置。首先我们来理解一下什么称为外部化配置,我们想要这么一个场景来编写一个应用,这个应用呢要连上数据库,数据库有它的连接地址,用户名、密码,如果我们把这些信息呢,全部写死在代码里边,那我们应用要搬上生产环境,我要改数据库的地址、密码,这些我们还得动代码,非常的麻烦。而我们在学Java基础的时候呢,我们都是将这一堆信息拿出来放在一个配置文件里边,方便维护,所以呢,我们把这种功能就称为外部化配置,简单一句话总结就是说,我们将所有的这个信息抽取成一个文件放在外边集中管理,我们就称为外部化配置。而在BOO里边,外部化配置功能,你想要用,简单起来也非常简单,你只需要来掌握application properties文件里边该能配哪些就行了,因为我们boot一个配置文件就能掌控我们整个应用里边的所有配置规则。但如果你想要用,复杂也非常复杂,我们可来参照。
01:01
的官方文档在第二章internalnalize的configuration我们外部化配置里边,所boot呢,用了非常大的一段话来说了它的整个外部化配置的详细规则,我们可以来看一下,他说boot啊,可以允许来用,可以允许让我们使用外部化配置,而这个外部化配置能让我们在不修改原来代码的情况下,可以适配多种不同的环境。而且我们外部化配置的这些来源包含我们常用的这么几种方式,第一种是Java proper file,比如说我们写的Java proper文件,我们可以把配置文件写成proper文件,我们用过,包括呢,你外部化配置也可以使用压面文件来进行配置,比如我们的这些压面我们也配过,然后呢,另外就是你的这些配置信息也可以来源于叫environment variables,就是我们的环境变量啊,这个环境变量呢,大家也见得比较多。我们可以来参照在这一块。我这高级系统设置里边,我们这专门有环境变量,我们Java基础的时候呢,都配合很多,所以环境变量里边的内容也能获取到,比我们来举一个例子,我们还想获取my home,在我们运行时也可以获取到,怎么获取呢?们在这来写上这么一个controller,来测试一下private string message,而这个信息呢,我们可以来使用at value,不仅能从配置文件中取值,我们也可以呢,我们说这些配置的信息可以来源于环境变量,所以这个值也能取到。方给大家来测一下public string,我们的这个get message at,一个get,那我们的这个就叫message吧,我们来直接把我们取出的message返回一看就行了,来启动起来。
02:45
来访问当前项目的message,我们来看能不能拿到没的安装目录。来local house,我们现在是8000端口的message回车,好,我们看到呢,能返回我们的me安装目录没有任何问题,所以呢,我们的这个配置信息也可以来源于我们的环境变量,而且呢,不仅是环境变量,我们系统里边相关的属性也能拿到,我们可以来到我们的这个主类方法里边,我们这个spring应用只要一启动起来,它呢会给我们返回这么一个叫application contexttest,我们这个里边的东西呢,环境变量的值都有哪些?我们其实就是从这个代码里边也能获取到get environment,获取到我们当前的这个环境,那当前的这个环境里边呢,其实就包含我们的system environment系统的环境变量,我们之前获取过,还有呢,我们在这有一个叫get系统的属性,其实我们所有能获取到的值都是集中于我们这两处,我们可以来看一下系统的环境变量以及系统的属性。
03:53
我们不妨来启动看一下。我们整个呢,计算机这个系统里边的环境变量,其实呢,我们在运行的时候我们也能拿到,拿到的呢,就是第一个叫system environment,在这一块的内容,在这一块的内容呢,我们也看到了,我们想要获取memory home,那这边呢是有的,没问题,所以呢,我们不仅能获取到系统的环境变量,还能获取到我们GM虚拟期我们运行时的一些属性信息,比如我们当时的Java的运行时环境,哎,这有Java SE运行时环境,把我们操作系统的一些信息我们也能获取到,那我们再来举个例子,我想要获取操作系统的信息,比如说呢,我们那一块打印的这个东西,我们就叫OS内吧,只要呢,我们通过主程序这两处呢,包装的所有信息,以及配置文件的信息,我们都可以拿到。
04:48
我们可以来看一下怎么获取操作系统at value直接到大括号,那这一块呢,我们控制台在这儿有一个这样的打印,来看一下我们的控制台,我们的专门操作系统呢,有一个叫OS点内,这就是我们操作系统的名字,我们也能拿到好来重新启动测试一下来我们打印的时候呢,让他message把我们操作系统的名字来加上。
05:18
来重新访问测试。来刷新,好发现呢漫的安装路径,包括我们操作系统的信息都能获取到,所以这就解释了我们spring boot的这些配置来源,你可以呢,编写成private文件,压ma文件,或者在环境变量里边配都行,甚至于在命令行参数,命令行参数呢,我们也以前也体会过,我们呢把我们的这个炸包,只要我们一打包以后呢,我们以前用过这种方式来启动炸包,就是呢来到这儿,我们可以来直接使用Ccmd窗口,我们的这个Java杠炸的方式,这呢就是命令行启动我们的这个Java,而我们的所有命令行参数我们以前用过,比如这样我们来spring.application.name所以我们所有的这个属性,我们都可以在命令行参数上继续来配,那这些呢,我们都可以作为我们配置来源的获取,这是我们非常常见的这几种配置来来源,这我说的外部化配置的第一个细节,我们的配置来源可以有多种多。
06:20
第第二个细节,我们配置呢,配置文件还是有查找顺序的,我们默认的配置文件呢,都叫application proper,但环境标里十的叫application杠,环境标识的这些,当然呢,其实是这些文件,我们来看一下啊,在spring BOO的官方文档里边说我们这个spring boot啊,使用一个非常那个有序列的我们这个配置的顺序,然一个特殊的这个序列顺序,我们整个配置文件呢,它是在我们这个敏感场景里边还有一些的覆盖行为的,所以我们需要呢掌控一下这些行为,这块呢,他说我们这些行为从低级别会覆盖我们早期的配置,比如呢,我们boot所有的配置信息可以来源于这14种情况,这14种情况包含第一个你使用Java代码spring applicationli,相当于spring的这个主程序调用它的set deat properties这个方法,你设置的一些值我们可以作为配置值获取,或者呢,你使用property source引入的外部配置信息的值我们也可以来获取,包括呢?
07:20
诶,第三步就是con data,你使用你的这个配置文件,配置文件呢,那就是我们的application properties,然后呢,第四步有各种各样,包括我们操作系统的环境变量,Java的系统属性,以及我们的你你的配置来源,也可以是经营Di的一些属性信息,包括我们当前sole的初始化参数,呃,包括sol的这些配置信息,这都有等等等等,以及第11行我们看到命令行参数,也就说呢,我们s boot可以通过这么14种方式能获取到我们配置信息的值,但这两种方式我们现在用的非常多,第一种们写配置文件,我们直接在我们的这个项目里边application properties配置文件。第二种方式,我们启动的时候,我们还可以在后悔一下,再在启动过程中使用杠杠命令行参数,再来指定配置信息的值,但这些呢,是由我们优先级的,我们后边的优先级会覆盖前面的优先级,那如果我们出现了同名配置,比如我在配置文件里。
08:20
编写了端口号serve.port但是呢,我们最后启动的时候又在命令行参数上加了serve.port那就命令行参数会覆盖前面的,所以这一块的整个这个配置顺序啊,它相当于兼容的非常多,我们倒不用记住这么多的顺序,这么多的顺序呢,只给了我们一个提示,就是所有的这些顺序,一句话后边的可以覆盖前面的同名项配置有优先规则,那我而且呢,我们来关注我们第三点,第三点呢是我们最常用的,我们要编写配置文件,而且这些配置文件啊,它也有一个默认的查找位置,不是说配置文件只能放在resource下边,我这配置文件呢,它可以允允许有这么多位置,我可以一直往下翻。
09:09
叫external application properties,我外部化的application properties配置文件,你的这些properties文件或者麦尔文件,它其实呢,默认会从这五个位置给我们来进行查找,那这五个位置也一样,大家看还是这段话,我们后边的这个会覆盖前面的优先级,然后如果有同名配置,那后边的会覆盖前面的,那么这五个位置呢,翻译过来就是我们说的这一块,第一个叫class pass root,就是类路径的跟路径,所以内路径的根路径,我们看到只要是我们源码包标识的这些都叫内路径的根路径,这个是内路径的根路径,那Java下边开始的这也是类路径的更路径,你只要在类路径下登路径下放的application properties或者压面,它被认为是配置文件,包括呢,你在类路径登录下的con目录,比如呢,这是我们类路径,那下边呢,还有一个文件夹,这个文件夹呢叫con,你在它下边写的application proper或者。
10:10
它呢也被当成是配置文件,或者呢,你是在炸包当前所在的目录,比如我们当前项目一发布以后,你把这个炸包专门发布在服务器的某一个位置,那炸包所在的目录里边的这个配置文件他也能拿到,包括炸包所在目录的这个con菲格目录也能拿到,还有con菲格的子目录,但必须是直接子目录,如一级子目录,你想要在二级、三级、五级那就不行了,那这里边的都能拿到,所以我们来体会一下这个配置文件的查找顺序,来我们来测试一下,来到application proper,那为了测试效果方便起见,我们就不让它激活这么多其他场景了,因为我们现在看到们不是不呢说我们想要加载配置文件的这些信息,默认呢,可以从这几个位置读取到你的application proper或者application压面,那这几个位置呢,我们分别测试,第一个是类路径的跟路径,那就在它这我们来配上这么几个东西。我们。
11:10
之前呢,好像有一个请求叫获取person的内容,那就person name和person age,那么就来配几个这样的东西,而且呢,这个person name还有person age。大家注意啊,我们person name person edge,它在这呢给我们来注释profile fair这个呢,这个是在我们这个相当于生产环境才给我们来注入到容器中的,那我呢,可以来让它指定,它不止在生产环境能住进去,因为我们现在禁用掉环境了,你可以呢,在生产环境或者在默认默认情况下也行,Def fort,这就叫默认,如果我们不加任何环境标识,那就是默认,我们也会注册这个,那现在我们是默认环境,默认环境呢,我们容器中会来索取proper person里边的name和edge,那我现在在application里边来配一个person的name,等于比如呢,我们现在在这写了一个111,然后呢点H等于111,我们发现呢,它有这么几处位置,第一处在根路径这一块,那我们根路径下写了第二在根路径的con菲格目录,那我可以在con菲格目录再准备一个application。
12:21
或者面都行,你只要是压面或者properties他都能发现,我再来写一个person person的name信息,我们来写一个222,然后呢,它的H也是222,然后呢,接下来我们除了在类路径下来写外,我们还可以在哪一块呢?还可以在我们这个项目一发布以后,项目炸包所在的路径,我们先来看这两个类路径会是什么样的效果,我如果启动起来,那启动起来呢,我们现在相当于激活默认场景。们稍等一下,好,我们项目呢8080启动起来,那么就来访问八零八零下的person回车,我们发现呢,它打印的是2222222的,原因是我们config目录的配的是222,而我们登录镜像呢是一一,所以相当于我们康菲格目录的生效了,但如果你把这个目录名叫成其他的,那就不行了,来随便叫一下,来重新启动,所以这就前面两个我们印证了,在这两个位置我们都能发现,而且呢,优先级下边的高。
13:36
我们可以来看一下刷新,好现在就变成一一,因为呢,你不叫con目录,它发现不了,好我们把这个呢重新叫回来,然后呢,除了这些外,我们还可以在其他目录,就是说炸包所在的位置,那好我现在把当前项目来停掉,来给它打个包,Clean package。一定要可令把原来的这个包呢先清掉,然后呢,我们重新给它打包,重新打包这一块呢,说我们的这个target,这个原因说我们这个target不能可令,我们在后台呢,之前启动过一个什么东西吧,这块的提示呢,就是费尔图我们来看啊,费尔图delete我们这个删除失败,那我们来重新来。
14:22
哎,这是我们的target目录,好,我们来重新可令一下。好,我们所有的项目都清掉,然后呢,我们来给他重新打个包。把我们以前启动的项目呢,一定停了来,重新给他打个包。重新打包以后呢,我们再来看这两处路径能不能用我们重新打包,重新打包我们把打包后的这个项目我们拿过来,这个Java ctrl c,比如呢,我们专门来准备一个文件夹,我们来测试一下。
15:02
你就叫boot了,这个文件夹,然用未来呢,我们把这个项目一打包,可能要部署到服务器上,可能在服务器的这个位置,假设我们就在服务器的这个位置,要说呢,人家除了除了你打包里边的这两个路径,我们来看啊,因为我们打包以后呢,配置文件其实还有的们用好压打开来看一下我们的这个类类路径,那我们的这个类路径里边在我们的boot英放我们的类路径里边有我们的conf文件夹所在的位置,它这里边呢也有,那么现在呢,重新来做一下,那前两个位置呢,我们已经验证没问题了,炸包所在的当前目录你也可以写,然后未来呢,如果我们把这个部署到服务器上,等某一天我们想要改配置了,我们甚至于都不用把这个炸炸包删了,重新再来下架打包一个新的,我们只需要直接在外边,我们来准备一个配置文件,好,我直接在外边,我们把我们以前的这个配置文件,我们直接拿一个吧,CTRLC。
16:02
我直接呢,在它炸包所在目录的这个位置,我放一个,呃,开始压面,然后呢,我们来给它给一个叫333333,我们这么一写,那我们的这个配置就生效了,生效的原因是因为它的优先级低,所以呢,哎,不是说它优先级低,它呢是我们这个低顺序,它最后加载会覆盖前面的同名配置,所以我们来看一下我们的效果,我们把这个项目呢停掉,我们来启动这个炸包,看它输出的是什么Java杠炸the boot这个炸包。好,我们现在来测试来刷新,然后发现呢,它输出的是333,那就是我们这个位置也得到了验证,而现呢,或者在你当前炸包的这个con菲目录下,这个场景是哪个呢?比如我们是这个在你前面的老前辈程序员,这这呢把它的项目部署到我们当前服务器,假如这就是一个服务器,哎,别认为我这儿有图标,这就是Linux系统,我们部署到呢,当前服务器的现在这个目录下了,然后呢,这是老前辈配置的这个信息,你也不敢动,你也不敢删,但是呢,你还想叠加你的新配置怎么办?你还可以直接在它的外部,在他的这个所在的位置,我们直接来写一个config这个文件夹,在这个文件夹里边呢,你写你的配置走,你写你的配置,比如这个配置呢,我们直接在里边来改改改一个叫444444,哎,我使用这种方式,我们再来测试一下,然后呢,这是老。
17:44
前面写的,那我们写的在conf文件夹下来重新启动这个项目,那按照boot官方的说法,那就是你在我们炸包所在的这个目录的con菲子目录下,你也能生效,而且呢,它是优先于我们直接在炸包这个目录下,所以呢,我们这个con菲目录下的内容会覆盖它,那就会得到444,我们可以来看一下是不是这个效果,诶没问题,那甚至于呢,在最后一步你发现呢,你自己配的这个东西你也不满意,然后呢,我们这个项目啊,一版本,二版本,三版本的配置各种还不一样,那你呢,可以在这儿再来写一个文件夹,如果当前像现是V1版本,哎,我们一版本里面的配置,比如说人家可以在comfort文件夹下直接字目录,要必须只能有一层目录在下面呢,你再来准备一个配置文件走。
18:37
这个配置文件呢,我们来给它修改一个,我们叫555555保存,然后呢,我们来重新启动这个项目走。来看一下是不是我们得到五五。好,我们在这来刷新,来刷新。
19:05
诶,我们发现呢,这没有变,没有变的原因呢,是我们当前windownux系统的问题,它的第五条呢,实际指的是我们要在我们当前如果是Linux系统,那们更是这个杠root目录,然后呢,我们更下呢,可以有一个config目录,在这个conig目录里边的子目录里边的配置我们是可以用的,所以呢,我们第五条只能放在Linux里边,我们来进行演示,那么就不演示了,但我们整体的效果就是我们下边的所有整个顺序呢,是下边的优先级覆盖上面的优先级,这就对我们整个生产环境里边,我们想要改配置就变得非常简单了,无需修改代码,在外边呢,直接改掉就行,这么说的第二种我们配置的这个文件查找顺序,Application proper顺序,第三个配置文件呢,也有加载顺序,这个呢,大家可以来下边尝试一下,也非常简单,也就是说我们优先以炸包内部的OB properties加上它指定的环境变量来进行加载,然后呢再来加载JA包外部的,这个呢,应该不是优先顺序,老师还是。
20:05
说错啊,这个顺序呢,还是往下加载,我们总是下边的覆盖上边的,用刚才都测试了,我们确实炸包外边的这个application properties的值能覆盖掉JA包内部的,所以大家一定要呢记清这些数据,而且包括我们环境变量指定的精确优先,要会不会覆盖我默认的这个配置信息,所以一句话在我们的最终总结就是指定环境优先,指定环境优先,然后呢外部优先,越往外越优先,所以大家就会看到我们炸包内部配置的一些这些信息,我们在最后一步使用命令行启动的时候,命令行都是外部的,然后它的优先级居然比内部还高,所以呢,越往外越优先,然后呢,包括后边的覆盖前面的同类项,那抓住这个本质,我们后来想要修改我们的这些配置信息,那就变得非常简单。
我来说两句