00:00
好,前面呢,我们基础入门篇的学习就结束了,我们通过基础入门篇掌握了spring boot的简单使用及了解了它的自动配置原理,接下来进入到我们这个核心功能片的学习,在核心功能片呢,我们关注于以下几点,首先第一个我们spring boot里边的配置文件怎么使用,Spring boot如何来做web开发,以及spring boot我们如何访问MYSQL数据库,这些包括spring boot如何使用解UNIT5来做单元测试。以及我们spring boot在生产环境的这些指标监控功能,以及他的一些其他原理解析,那剩下的这几个呢,都是比较大块的内容,那我们再来讲下边的这些东西,之前我们再来说一下配置文件,那配置文件呢,我们之前在入门篇的时候,我们用过properties配置文件,但我们说certaint,除了我们可以在全局编写一个application properties作为它的配置文件外,Certain boot还兼容另外一种配置文件格式叫ma。
01:03
也就是我们说的这个ya ML啊,我们把它叫压面,这个压面呢,它的全称叫压面,它这种呢是一个递归写法,压面a mark up language,就是yama呢,是一个标记语言,和yama isn't mark up language它不是一个标记语言,所以呢,这大家戏称它为薛定谔的雅美尔对吧?所以呢,这个递归写法呢,最终指导我们的意思其实就是雅马尔,说来说去啊,大家也称为它也是另外一种标记语言,反正呢,无论你是怎么,你后边呢都是这个,就像插麦一样,后边都是markup language,就是说呢,它们都是标记语言,那既然是标记语言,其实都是一些标签啦,或者什么的写法,而且呢,我们说压慢,它非常适合用来我们后来做以数据为中心的这些配置文件,比如我们这些配置都是来存储一些配置数据存储在里边,而不是去来定义一些些行为动作,所以呢,我们就非常适合使用压面。而压。
02:04
但呢,在未来很多的其他技术里边,也基本作为人家配置的这些首选规则,它比起我们这个插麦有更简洁的语法和跟我们这个轻量级的这个占用的空间啊,我们更省资源,所以我们也一定是要来学习它的使用,而我们这个压面整个使用期间也非常简单,它这个语法几乎简单到我们这个只需要五六分钟,我们就能掌握它这个语法呢,包含我们这个,首先我们在无论写什么配置文件里边。无论是我们以前写properties还是什么,我们肯定写过很多的配置都是KV的方式,就是我们的某一个价等于什么值,那在压面里边呢,KV的表示非常简单,你只需要写降冒号,然后呢,接下来一定大家一定注意有一个空格值,所以呢KV之间是有一个空格的冒号空格,然后呢,这是我们的最基本的KV表示办法,另外呢,我们这个KV区分大小写,然后呢,接下来最神奇的地方在于它使用缩进来表示层级关系,我们以前插麦我们来写法的时候,比如我们来写了一个user,我们这个用户,那用户里边呢,有一些其他内容,我们标签呢有开辟,然后呢,用户里边有一些东西,那我们标签呢,是在里边,在我们这个标签里边,我们来写的那呢,是用我们这个标签的整个开币,它的层级关系来表示,我们这个父子标签表示层级关系的,而在压面里边呢,我们就是通过空格缩进,比如我们这个用户里边,用户里边呢,这是我们user信息。
03:35
那user信息里边呢,有一些其他属性,那我呢,就在user下边空上两格,我再来写其他的东西,那只要呢,我们一看缩进,它是在这个东西里边的说明,我们这里边配置的东西呢,属于我们这个属性里边的,所以呢,它是使用缩镜来表示层级关系,另外缩镜呢,我们默认不允许使用table啊,大家为了快他一个table我们缩进几格就过去了,我们只允许呢使用空格,但然实际我们在用idea开发的时候,大家放心大胆用table宝也没有出现什么问题,然后呢,另外我们缩进的空格不重要,但是呢,只要我们相同层级对齐就行了,比如我们这个元素,然我们这个用户里边呢,它有它有汽车,这是我们的user,它有一些我们要写一些汽车的属性,那汽车的品牌之类的,那首先有用户的一些基本属性,用户的基本属性呢,比如我们的空的三个,然后呢,我们在这一类呢,都是用户的基本属性,它名字年龄等等,然后呢,用户还有一辆汽车,我写了一个。
04:35
怕汽车呢,也是我们用户的这个属性,那汽车呢,又有它的品牌什么,那接下来呢,把汽车的品牌之类的,那我以前空三个,我现在也不可以,可以不用空三格了,我空了四格五格两格都行,那我在这空哪怕空一格,只要呢,我汽车的所有属性左边对齐,那么就能看到左对齐的这一溜就是属于汽车属性里边的我们定义的KV,所以呢,这是我们的使用我们的整个缩径来表示层级关系的,另外呢,我们在压面中井号来表示注释。
05:09
然后呢,包括我们这个单双引号来表示我们这个字符串,而且在我们这个压马尔中,我们要写一些字符串,我默认呢是不需要来写我们这个引号的啊,我们字符串无需加引号,如果我们要加我们这个单双引号呢,它其实会表示不同的意义啊,就是我们说的这个转义与不转义,那么接下来呢,做一个示例就行了,在无论我们来写任何的这些,呃,配置文件的语法我们都要考虑这么几点,首先我们在配置文件里边怎么表示一些字变量,也就是我们说的单个不可分割的值,我怎么来表示一个日期,表示一个不玩类型表,表示一个字符串,表示一个数字等等等等,那自变量的表示方法非常简单,你写K冒号V啊包,当然冒号后边呢,有一个空格就行了,这一块V字符串写字符串,数字写数字,直接写第二个,接下来我们该怎么表示一个对象对象呢?我们两种写法,因为对象里边都有属性,所以比如这是user的对象,它有一个user。
06:09
Name等于什么?然后还有一个A等于什么,那怎么办?那我们这个user属性接下来冒号它里边有什么?所以接下来左对齐它里边这些属性呢?左对齐以后加user name等于张三,然后H等于18,然后真的等于什么,我们就在这儿可以来写上,这是我们的对象表示法,当然只要左边对齐,这都是我们这个里边的属性,然后呢,每一个值都写上空格,当然还有行内写法,行内写法呢,就非常类似于我们写结子,直接一个大括号K冒号V,逗号K冒号V,逗号K冒号V,然后呢,接下来我们再来看我们的这这种配置,我们如何表示一个集合,也就是我们说的数组,这个数字呢?包括呃,A list等等我们这些集合,集合类型怎么表示呢?行内写法也跟杰森一样,比如我们这个用户,他喜欢的这个东西,他有很多是一个集合,比如我们那接下来就用冒号中括号,中括号呢,他喜欢什么什么逗号什。
07:09
啊,逗号元素,元素之间用逗号分割这块加不加空格都无所谓,逗号分割就行,所以呢,这就是我们说的行内写法,当然也有我们的普通写法,一个杠就代表一个元素将来空格元素的值,一个杠代表一个元素空格元素的值,那我们这种写法呢,就代表我们K这个属性,它呢有三个值,这三个值呢,分别是V1 V2 V3,来我们说这么多,一个简单的例子就直接完事了。好,我在这儿呢,准备了一个person类型的对象。我们把它拿过来。我们来看一下,如果我们系统里边现在有这种类型的对象,我们如果使用压该怎么表示出来person类型,好,我们把这个person呢,我们直接复制过来。把它里边的属性复制过来,那另外呢,为了方便我们直接enter data enter data,我们来加上龙bank的一些注解,Enter data,那我们还没引对吧,我们一会引吧,然后呢,我们先把这些日期内我们来导进来查YouTube的,然后呢,包括我们list map这些基本的,我们来导进来list。
08:20
Map,然后U求的还有我们的这个set,这都是一些集合类,那接下来我们还有一个宠物,好,我们再来建一个我们的这个宠物类。好,宠物类里边呢,接下来我们再来看我们宠物类里边有两个属性,一个呢是宠物的名字,还有一个它的这个体重,然后接下来我们为了方便,期间我们都要引入loan bank这个注解,这个依赖,我们来写一个loan bank,好,我们不用写我们的依赖版本spring boot帮我们决定好,然后呢,再扎B上给他们来添上get set方法enter data就行了,来稍等一下这enable auto import,把它的这个自动导入一开启。
09:07
等他把依赖都引完,我们来enter data,好,我bank的这个注解就好了,包括我们这个也一样,Enter data。我们来给他们也加上突词论方法。给person,我们来也加上to string的方法,好,那么现在我们来表示一下这些东西在配置文件里边怎么表示,那其实如果是properties properties,我们以前该怎么写还怎么写,比如我们前学过一个注解叫configuration properties,我们可以跟配置文件绑定,跟配置,跟配置文件的哪些前缀进行绑定,比如呢,我就跟以person开头的,你如果想在properties配置文件里边配这些,那就你应该是这样写person开头,诶,你想username的值等于什么,那你就person.user nameme等于什么什么什么,那我现在呢,就不要我的这种proper配置文件了,我把这个去掉,我们来看在压面里边怎么表示,我来专门来创建一个叫application点压面,这个压面呢,你的后缀名可以叫ya a ML比较全,你也可以简写为YML,这些呢都能识别,也就是说在我们spring boot里边。
10:19
你只要有我们这个全局配置文件,你是application properties还是压面,哪怕你两个都有,这两个呢,都会生效,所以他们所有配置的所有内容合并起来一起生效,那么接下来也这么来做,首先呢,我把这个person我放到容器中component,然后呢,它代表它是容器中的组件,既然是容器中的组件了,我呢就让这个组件跟配置文件绑定,跟配置文件的哪个前缀绑定,我们就来指定一下,我就跟配置文件的person这个前缀绑定,所以呢,接下来以后我想要配跟我们这个person有关的,我们就在压面里边以person为前缀,我们来看是配好person为前缀,Person的第一个是用户名,大家看啊,我们这个pro里边,我们是person点用户名,而在页面里边person里边的username,那我们就给它换一行,哎,大家你看你一换一行,人家在idea里边自动给你空两格,然后我们来写一个username。
11:19
来看一下啊,这个username这一块写什么,你这就写什么就行了。用户名,用户名是什么呢?比如我们叫张三,那我们就这么来写,一定要有个空格,KV之间有空格,然后呢,再接下来我们来写boss,哎,这个张三是不是老板,然后呢,我来写一个初,那就代表他是老板,所以这都是我们的字面量最基本的数据在这怎么写,就这么来写,然后呢,再来表示张三的这个生日,哎,我们来生日来写一下birth生日,这个生日呢,我们来直接写一个,比如2019年啊,我们这个默认的生日格式是用斜杠,比如我们来12月9号,好,我就这么来一写,然后呢,再来加上。
12:04
那么这呢,还有一个年龄H,所以H冒号走H呢,这都是基本属性,是直接写,主要呢是KV之间得有空格,然后呢,K跟K之间要左对齐,代表呢这些K都是person里边的属性,然后呢,再接下来我们这个H里边,接下来它还有宠物,宠物我们一会儿写,还有他感兴趣的东西,Interests。好,感兴趣的东西,比如我们这个篮球,我就来写个篮球,比如足球,这都是我们感兴趣的东西,这这种呢,我们说这种叫什么写法,行内写法,直接这么来写,或者呢,我们也可以这么来写,哎,注意我们这个井号呢是注释,我来写一个interest词,我们感兴趣的东西,我们说数组呢,也可以来。一个横杠代表一个元素,我们就叫篮球,然后呢足球,包括呢,我们说这里边的基本的呃,属性你都能写18啊,包括呢字符串,包括日期,你想写什么,在这呢都可以来写,这是我们来写的interests,然后呢,再接下来我们的这个,这还有一个list啊,List其实跟我们这个数组它们都是一模一样的,所以呢,我把list的也配在这儿,所以list的话呢,我就可以拿中括号来写,或者拿这种表示方法都可以,哎,我喜欢的这个动物,阿猫阿狗,我们来就随便来写几个。
13:35
好,我们在这来写完了以后呢,再来接下来还有这有一个它的这个乘积score,它的乘积,比如我们来进来乘积呢,我们会发现它是一个什么呢?我们这个乘积类型,它是一个map map的key是string,只是一个object对象,所以我们说map的写法两种map法,第一种呢,你就直接大括号里边写KVKV,然后第二种是什么呢?就是我们说的。
14:05
我们这个曼普的写法呢,他的下边,比如mapf,他呢有几个成绩,第一个是他的英语得了多少English,比如我们来得了80分,然后呢,还有他的数学,比如我们来得了90分,好,这是我们说的这一种写法,当我们漫步的另外一种写法,更简单的写法就是我们来把这个score加在这。School,好,另外一种写法呢,那就是大括号,我们的English好,英语呢得了80分,然后呢,还有数学得了90分,诶数学得了90分好,这一块呢,倒不用我们的这个空格,因为这一块的写法,这是杰省的这个表示办法,K以冒号V,逗号K以冒号V,然后呢,再来加上我们这呢有乘积,乘积完了以后呢,还有薪资,薪资呢也是一个set set,那这个set呢,我们同样的在这呢,也是拿我们这个数组表示法,或者这种表示法我都行,反正都是集合里边的元素,比如它的这个薪资,薪资呢里我们来写一个9999.98,这是一个,然后呢,9999.99来写上两个月的薪资来放在这,这是他的salary薪资,然后呢,最后我们再来看表示对象,哎,我们这个人呢,他有一。
15:29
宠物,那么这个宠物怎么办?我们来到这儿宠物,宠物呢,我们又有一些值,宠物呢,它有它的名字和体重,所以呢,我们来到这儿宠物的话,宠物的名字怎么办?因为宠物呢,是我们person里边直接的属性,所以宠物跟其他属性一样,全部是在这一列对齐,而宠物的名字是宠物里边的属性,所以我回车,哎,写在pet这个里边,那里边我怎么写呢?有宠物的name,我们在这儿以表示宠物的名字,比如叫阿狗,然后呢,还有它的体重。
16:07
把他体重拿来。好体重,体重我们来表示在这,这就是呃,我们比如99点。九九好,我们来表示了一个体重,这是我们来写了这个属性,那就剩最后一个叫map,我是map类型的,然后呢,Map就是map类型的,这里边K呢是一个死string值呢,是还是我们这个宠物,哎,我想让这个呢写成这样子,就是哎,生病了的宠物和我现在健康状况的宠物有几个,那我就这么来写opens所有的宠物,所有的宠物呢,因为opens这个属性呢,是我们person里边的,所以跟person里边其他属性对齐,而所有的宠物我们分为两类,第一类是生病了的sick,比如我们生病了的,然后呢,生病了的,然后呢,宠物有多少个,大家看啊。
17:02
第二类呢,是健康了的,比如我来写一个health,宠物有多少个,那第一类生病的宠物我们来看一下啊,因为呢,我们map k是string string呢相当于我现在有两个K,一个是seek,一个是healths,然后呢,值它是一个list,所以呢,我们这一块的值它又可以表示成集合,简单的这个自变量也可以表示成对象,我都可以来表示,所以呢,现在我们这个seek,现在既然是集合,那我就来写第一个我生病了的宠物,第一个宠物,因为一个每一个宠物呢,又是一个对象。我们来看每一个宠物有名字,有体重,所以呢,我们第一个生病的宠物来使用这种写法,第一个生病的宠物呢,比如它的名字叫呃,叫阿狗,然后呢,他的体重。来,把他的体重也拿来。在这儿我们来标注上他的这个体重呢,是99.99,然后呢,这是第一个生命的宠物,第二个生命的宠物,因为我们说第二个呢,它又是一个对象,对象呢,除了用大括号这种表示办法,我们还可以直接写KV,所以第二个生命的宠物我直接写KK呢,就叫阿猫,然后呢,它的体重是多少?
18:24
88.88,然后呢,第三个生病的宠物,哎,我也这么来写KV,因为我们来看杠代表一个元素,这个元素呢,我们一看这种写法,它是一个KVKV这是一个对象的写法,所以呢,第三个阿猫阿狗,还有我们的这个,呃,阿虫对吧,我们一个小虫子吧。好,然后呢,我们这个white来这个冒号一定是英文冒号啊,不要弄成中文冒号,好,这是我们这个生病了的,那健康的宠物怎么办呢?那我同样的健康宠物,我最快的写法,我用数组这种写法,然后呢,写对象一个两个对吧,然后呢,你想要复杂的写法,那就是我们这种,哎,第一个健康的宠物。
19:19
哎,比如我们这个阿花。然后呢,它是199.99,然后呢,第二个健康的宠物,你也可以写成我这种写法,当然也可以写成阿明啊这种写法。好,这时候呢,我表示了一个相当于复杂对象person里边呢,既有基本的变量,也有对象变量,也有集合变量,还有复杂变量,所以呢,我们在这儿通过压面一表示,我怎么知道,我表示对了,那我呢,就可以直接在这儿configuration properties,它里边的所有属性跟配置文件的person来进行绑定,然后呢,我们来。过来用一下就行了,所以呢,我现在来做来来做一个测试,来做一个什么样的测试呢,来到这儿,我们直接呢,从容器中,或者我来写一个controller,我们把这个东西呢,来做出去,Controller,点一个hello controller好,我们来就来返回,返回呢,我来写一个rest ctrl了,就把我们配置文件里边的这个人的信息,我们就来返回就行了,Person person。
20:31
一个request map,好,你访问我这个person,然后呢,接下来我给你return return谁呢?我把person return出去,而这个person从哪来?它在容器中,所以我自动注入就行了,Person person o where。O,我们把容器中的这个组件直接一返回,然后呢以杰森写出去就行了,然后我们来启动我们的这个测试,我们来看我们的这个person的,我们使用配置文件这种表示的办法对不对,我们能不能写出来。
21:10
阿木来让它启动。好,启动大家注意,诶,这报错了,这报错的原因他说fair to conig,就说他配置这个data source配置数据源给失败了,说你这个数据源的URL属性没指定,为什么呢?因为我们之前在这演示我们使用spring initializer来创建项目的时候,哎,我给还勾选了一个场景,这个场景呢,就是来访问red,呃,还有访问我们这个数据库吧,有没有my babies,我记得因为我们要访问我们这些数据库的信息,所以我们没有配置些red在哪,MY哦,在这儿没有配我们这个数据库在哪,所以我们就把这两个场景呢,我们去掉,去掉我们就开发一个最简单的web应用就行了,好,我现在重新启动。
22:01
我们来测试一下。好,现在我们在8080端口已经启动,我们现在来重新访问一下,来访问8080 8080的person。我们来看我们写的对不对,诶,我发现person数据已经写出来了,所有的东西呢,都是我们在配置文件里边配的,所以这其实就是压面尔的语法是非常简单,我们只需要用空格控制好缩性,然后呢,KVKV截下来写就行了,这是我们的数组表示法,数组表示法二,对象表示法,包括呢,我们这个对象表示法的另外一种啊,本来这种KV就是对象啊,本来我们写原生的KVKV这就在表示对象,所以等等等等,包括呢,我们这个health它也是一个数组,哎,对吧,我们这个数组里边呢,呃,也可以写对象,也可以写基本量都行,但是我们在这儿呢,定义的person里边,我们这个数组里边只能装我们这个什么啊,宠物这个对象啊,所以呢,这是我们啊说的,我们使用压面以后来做配置,那未来呢,我们也希望我们最终呢,我们在spring boot里边配所有东西,我们推荐首选配在压面。
23:24
袋里边,比如我们未来要配spring的很多,我们要配他的banner,你来写banner,写完了以后呢,比如我们banner的地址在哪回车,诶他也帮我们能自动在这儿提示,好在这儿帮我们把这些都隔开,我们使用压面的好处就是我们明显能看到我们在这配。我们配好多这是banner的东西,这呢banner的location,比如我们还有image的这些卫生度等等,比如四,所以我们只要一看这一块的所有东西,我们都知道是属于spring来配banner,配它的整个banner图的,然后呢,当然里边还有配其他的,比如我们这个是spring是里边我们看还有配缓存的,大家呢就会在这儿看到,哎缓存里边呢有很多,比如缓存里边还有什么,就随便乱七八糟写一大堆PTL,所以大家呢就明显能看到这一块,这个区域是spring banner功能的,这个区域是配spring缓存功能的,所以呢,只要左边跟这边对等的,这都是大块功能,那这里边呢,都是对这些大块功能的细化配置,所以呢,我们能明显根据层级关系就能区分出,诶我们现在是哪个大模块,诶这个版ner大模块缓存大模块,这样呢,我们就比较方便,那我们以后呢也推荐。
24:43
首选我们使用页面,那未来我们在写项目呢,老师在创建的时候,我首选呢也创成页面,那另外一个呢,就是我们在这额外的多说一个,多说一个什么呢?就是我们说这一块,我们看大家写字符串的时候,我们无需用单引号或者双引号啊来引起来,但是你引起来其实也是一模一样的,比如我把它引起来。
25:05
如果是我们常规的字符串,你用单引号,双引号,不用引号都一样,大家先看我用单引号,我用单引号呢,我来刷新username呢,我现在是在哪一块,是在username张三,这好我们来刷新一下啊,看username有没有变张三。哎,我们这username怎么还是叉叉叉嘞,哦,对了,我们这个username为什么是叉叉叉,因为在这儿我们在这儿配了一个叉叉叉,所以呢,按照。我们这两个文件,大家看到这两个文件都生效了,Username是按照pro里边来的,而其他的东西呢,又是封装的是压面里边的东西,所以呢,也就是这两个文件会同时生效,但是按照优先原则啊,人家先加载了这个proper,哎,读到它里边的值了,那我们就不用管压面里边的值了,好,我们后来还会说这个事情啊,我们来重新启启动一下,我们现在用张三。
26:04
来刷新。好,这一块呢,我们这儿显示的是张三,这是KKV呢都带双引号了,这是张三,这是杰森字符串的写法,哎,跟我们现在表示没啥关系,包括呢,我写双引号,这还是张三,这没有没有任何问题。那带双引号的意义在哪呢?意义在于它是不是要转移特殊字符。我们可以来看一下啊。来刷新,大家看,如果我们常规使用这个单双引号都一样,但如果我们这么来写张三杠N李四,好,大家看啊,我要这么来写,我用双引号是啥效果?走起。我来刷新,那大家呢,会发现我们这个杠N就会输出为杠N,就是它原本的这个意思,就是一个字符串,对吧,但是如果我用单引号是什么意思。
27:08
走。我们在这儿来刷新看一下。N输出这个杠杠N,哎,在这儿不明显,因为我们要写出杰森,杰森里边呢,还给我们转了一层,我们这么输出呢,最明显大家来看hello CTR了,我们在这儿呢,已经拿到person了,我们来使用person,我们把person的username我们拿出来,Username呢,我们有一个杠N的换行符,我们来看它在控制台会不会输出这个换行符。来启动一下走。好,我们来看效果啊,现在呢,我们是这个,如果是单引号的话,我们用杠N,我来刷新,好我们来看控制台,然后呢,会输出杠N字符串,单引号,我们在这儿呢,大家标注一下单引号,单引号会将杠N作为字符串输出,然后呢双引号,双引号会将杠N作为什么呢?我们来看一下啊,如果我用双引号。
28:44
好,我们现在重新来刷新,不以这一块的为准来看双引号,双引号呢会输出为作为换行输出。所以呢,老师会这么来说,我说双引号,双引号不会转移,然后呢,单引号会转移。
29:13
然后我能猜到接下来弹幕就会说我记错了,然后我们来我是这么来理解的,大家来考虑一下,讨论一下,因为杠N它本身的意思,杠本来就是转移字符,然后呢,他想把N1转以后,杠N整体想要作为换行,在我们扎va基础的时候,我们只要一个字符串加上杠N,它就会输出换行,也就是说呢,换行是作为它的本身意思的,而我双引号呢,没改变它的本身意思,所以双引号在行为上它不会转换你里边的这个转义字符,也就是说它本身就是一个转移字符,他想换行,然后呢,我双引号不会改变他的行为,就是让他换行,而我单引号呢,会改变他的行为,你说你要换行,我不让你换,我把你的这个转移字符,我再一转,它就变成了这个特普通字符串了,所以呢,作为字符串输出,而这个会作为转移,那我是呢,从这个角度来理。
30:13
解,那不知道大家从哪个角度来理解,可以在下边讨论讨论,这就是我们说的整个压面里边的整个写法。
我来说两句