00:00
好,前面呢,我们说了一下spring配置文件的加载位置,我们可以在这四个位置来配置文件,那么我们也说了词boot可以用外部配置来进行配置加载,就是呢,我们的这个配置也可以写在外部的这些来源里边,那么它们都能正常工作,而我们演示呢,我是以咱们这个server.port为例的啊,我们这个调整服务器的端口,但是呢,到底咱们这个配置文件里边能编写哪些配置,每个配置又能怎么写,包括呢,我们这个自动配置,我们之前说的这个自动配置原理又是什么呢?我们接下来我们就来仔细来解释一下自动配置的原理,好,我们呢,创建一个新的工程。我来创建一个新的工程好,还是用spring初始化器好?我们呢,先come点硅谷,我们还是第二章内容配置相关,接下来呢,来解析的自动配置原理,Conflict,我们叫auto conflict。
01:17
我把这一块的包名呢,我来变得简单一点。好来把它变得简单一点来,下一步我还是呢选中web模块,这这一块呢,注意选中sperm的boot的版本,那我们之前呢选的是159,而在课程演示中呢,正好正值spring boot升级,哎,他把这个159呢生成一五十当前稳定版本,那我们呢也就来用一五十这个只要是前面的大中版本不变,他们呢只是一些小范围的升级,好我们就用它,我点一个下一步好我们来创建这个工程。这个工程创建出来以后呢,我们来看这个工程目录结构。
02:03
好,串出来,这也有配置文件,好,没问题,把这些删掉。然后我们怎么知道配置文件里边怎么写,我们以前呢,都是靠提示是吧,Serve点等于8080完了,再这么一写呢,这就是我们来改服务器端口等等等等,但是能写的这些东西其实是有依据的,那第一种依据呢,我们就可以看官方文档,我们来到spring的官方文档,它在呢这一章我们来往后翻它的最后一章。最后一章的附录里边有介绍能写哪些配置,我们来看一下,最后一张往下翻好,在这个附录里边呢,有一个叫common application properties呢,我们通常用能配置的这些属性,哪些属性能在application properties或者application中指定呢?就在这诶,它列举了每一个属性,包括属性的解释全都在这,大家可以看它,这是第一种,我来记录一下。
03:05
配置文件能配置的属性。参照。来,我们就来参照。参照我们这一块,其实啊,这么多的配置,如果靠我们来记,靠我们来想,或者靠我们参照文档,或者参照提示这样呢,其实都比较麻烦,只有我们真正研究透原理以后,我们才能随心所欲的应用。那呢,我们就来说一下它的这个自动配置原理,这自动配置原理呢,非常关键,哎,只要我们懂了它,这就是spring BOO它的精华所在。那么呢,我们来自动配置原理,我们从第一步开始说,当我们spring boot应用启动的时候,哎,我们从主方法里边进行启动的,主要呢,我们来加载了我们这个配置类,它里边最主要的功能就是它开启了一个叫able auto自动配置。
04:06
来说,诶,然后呢,Spring布它启动的时候。启动的时候加载主配置类。然后呢,而且开启了咱们这自动配置功能,所谓的自动配置功能呢,就是这个注解,而这个注解的作用呢,我们在hello word的时候其实给大家说过,但是呢,我们接下来再来回顾一遍,因为它还是非常重要的,那说这个注解它来开启自动配置,但是它的作用是什么?它做来我们来看,我们来点进这个注解,点进来它呢,上边我们就不说了,我们来说下边,它主要呢,利用这个选择器给我们spring容器中来导一些组件,说一下这个注解它的作用是利用我们这个select给容器中导入啊一些组件,但是导入了哪些组件呢?啊,我们以前都知道这个import就是给容器中导组件,导哪些组件要看它点进来它呢,我们来看它的负类,负类里边规定了一个方法,叫select import。
05:19
方法啊,那们详细呢,可以查看咱们select import方法的,咱们这个内容,我们就知道导入哪些内容了,我们来看导入哪些组项,在这一块呢,主要有一个configuration,最终会被返回,这个configurations呢,诶我来把这句代码拿来,我们再来回顾一遍,好是它,然后呢,它是叫获取候选的配置,这个叫取选的配置。来它导哪些组件,它是通过这个方法获取来的,那这个方法呢,好来给这儿来加一个。
06:00
制表符。我把这个格式呢,都整一下好,还有它。那这个方法的作用。我们来看一下它的这个作用。点进来点进来它作用呢,就是利用spring factor factory names这个呢,还是我们hello提过它的作用就是从,哎从什么呢,我来直接给大家点进这个方法,它呢,从从内路径下得到一个资源,得到什么资源呢?点进来它是扫描所有炸包类路径下的这个文件。它呢是扫描所有炸包内路类路径下的这个myta来扫描这个文件,那扫描这个文件的作用是什么?诶我们来看,那么这个文件扫描来呢,他在这个方法里边来说了,嗯,往下翻好把这个文件的URL得到,然后呢把这些UR每一个便利,最终呢,把这些文件整成一个proper文件。
07:21
然后呢,把扫描到的这些文件,扫描到的这些文件的内容,哎,包装成。成咱们这个proper case啊对象那呢,这些文件最终是properties对象,然后呢,它从我们properties对象里边获取一些值,把这些值呢,你看啊,每一个URL他们获取到的这个值,它来加在我们最终要返回到这个结果里边啊,这个结果呢,就是我们要哎要交给我们容器终的所有组件,这是什么呢?相当于这个function names就是我们传过来的class的这个类名,而传过来的class我们来看调这个方法,它传过来的class是调这个方法得到点进来,它叫enable,这也是我们以前说过的意思呢,就是从properties。
08:23
中获取到这个类。的值,这个类啊,这个应该是类名对应的值对应的值,然后呢,把它们。添加在添加在容器中,所以说呢,我们又看到我们按照它的这个意思,我们来到每一个炸包,哎,我们有第一个炸包,这个有factor,但是它里边呢,没有那个叫什么enable autofiration这个类对应的值,而我们呢,在第二个包里边,我们来找到了,哎,Factor,它里边呢有enable auto的值,所以呢,相当于把我们标注的这些组件加到了容器中。
09:20
也就说这个东西一句话就是呢,将咱们这个类路径下ta in否。INF这个文件夹中的里边。里面配置的配置的所有a auto configuration的值。然后呢,加入加入到了容器中。所以说呢,我们容器中最终会添加很多的类,哪些类呢?
10:03
来我们容器中呢,最终会有这么多的组件,哪些组件我们来给大家看一下,就是我们这个配置类里边,我把这些东西呢,我就直接复制过来全部的这些。这就是我们自动配置之源,它自动配置的开始,好,我们来用properties。好,我们看到这个文件的值就对应的是这样,它会把这些值来加载进来,每一个这样的类,每一个。每一个这样的什么什么auto configuration。R类都是容器中的一个组件,然后呢都加入到容器中,而加入到容器中它们是做什么功能呢?它们的作用就是用它们来做自动配置是如果我们说hello word的时候,大家还是稍微有点不懂,那我们在这呢再串一遍,这就是我们自动配置的开始,只有这些自动配置类进入到容器中以后,接下来我们这个自动配置类开始来起作用,我们来第三步,每一个自动配置类,哎,每一个自动配置类进行自动配置功能。
11:32
什么是自动配置功能呢?我们来以一个为例,我们就不看这么多了,我们以一个为例,以哪个为例呢?来翻一个稍微简单的,我们在后来慢慢再分析,复杂的有一个叫http including auto configuration,我们以它为例,我们来解释自动配置原理,以它为例解释自动配置原理。自动配置原理是什么呢?我们来看。
12:04
好,我们这个类呢,一进来以后呢,他脑袋瓜上哎呀标了一大堆的注解,我们来看一下这堆的注解。好,这对重点呢,首先configuration来表示呢,这是一个配置类,这是一个配置类,就类似于我们以前编写的配置文件一样,配置文件一样,这个配置类呢,它的作用也可以可以给容器中添加组件。而接下来第二个叫enable configuration properties,它呢叫启用咱们这个启用configuration功能。启用configuration properties功能,什么叫启用configuration properties功能啊,或者它是为什么要启用这个功能呢?你看它后边有一个类,这个类的意思呢,就是启用指定类的咱们这个configu功能,来点进这个类,点进来我们发现这个类上呢,我们就标了configuration properties注解。
13:19
来,我们把这个啊,我们来放在这儿。这是一个转化,好它呢就标了configuration注解,而这个注解我们都知道,它就是呢,从配置文件中获取指定的值和咱们这个B。的属性进行。属性。进行绑定,哎它的作用呢,就是来干这个活的,所以说我们首先看第一个我们配置文件中该配什么,哎,我们就按照它的这个指意,哎它呢要配spring htp已经coding,哎它能配这个属性,那属性里边能配什么值,那就对应这个类里边有什么,有force,那我们配force,有false request我们配request等等等等,也就是说呢,所有的配置我们都可以追溯到什么什么properties类中。
14:16
哎,所有我们来说第五个,所有在配置文件中,现在中能配置的属性都是在什么什么什么什么properties类中封装着。哎,我们呢,就以它为例,所以说呢,我们这个配置文件,配置文件能配置什么,就可以参照啊,某一个功能,某一个功能对应的这个属性类,比如我们看我们的这个功能,那听起来它就叫HTTP的编码自动配置,它的作用呢,就是HTTP编码自动配置帮我来解决乱码问题的,那我们来看一下它的这个功能,有了这个注解以后,A number以后呢,它相当于把我们这个。
15:15
配置文件中的值就跟这个类绑定起来的。将配置文件。中对应的值。得值和咱们这个HP including proper绑定起来,哎,所以说配置文件能配哪些,其实就是对应这个诈对象,然后呢,接下来它还有一个注解叫conditional on web开始翻译过来呢,叫它要考虑考虑呢,Web application什么意思呢?比方说呢,这个conditional啊,它呢,其实底层是spring的,Spring底层,Spring底层有一个condition注解,它的这个作用呢,它的这个作用它就是呢,根据根据咱们这个不同的条件。
16:08
不同的条件,然后呢,我们可以自己来进行条件判断,如果满足指定的条件,指定的条件,然后呢,我们接下来整个配置类才会生效整个配置类。里边的配置就会生效,所以呢,它是按照条件进行判断的,那么它的这个判断,那么翻译过来就是啊,它判断我们当前是不是web应用,哎,我们翻译一下,判断当前应用是否是web应用,哎,如果对condition定上的注写还不清楚的同学,可以参照我们上规发布的这个spring注解版,哎,这里边有详细的原理,那么呢,我们现在就来知道一下它的作用,作用呢就是判断当前应用是否外表应用,如果是,也就是说呢,我们当前配置类生效。
17:07
配置类生效,如果不是那就不行了,然后呢,接下来第二个他呢,还是一个判断,他呢,判断我们这个啊,我们这个。我们这个炸包里边有没有这个类,它是来判断我们当前项目。有没有这个类当前。像有没有这个类,有没有哪个类呢,就是这个菲,哎这个菲呢,其实大家都知道它是干嘛,是spring m VC中进行咱们这个乱码解决的这个拦截器,我们这个过滤器,哎,这是spring mvc,我们以前再来解决码的时候呢,我们配一个这个就行了,但是我们以前filter都是配在web中,然后让它起作用的,然后呢,这个第二个条件就是看我们泪里边有没有这个过滤器。
18:06
然后呢,第三个条件叫property,它是来判断,判断我们这个配置文件中是否存在,是否存在。某个配置存在哪个配置啊,就是存在perfect,哎,我们这个前缀存在HTP,然后什么配置呢?它的value就是我们要配这一项,是不是存在这个配置来这还有一个叫match啊,如果不存在,也认为这个判断是正确的,如果不存在,哎判断也是成立的。相当于呢,我们这个condition会返回出货false,然后呢,它判断只要成立了,那我们接下来就生效了,相当于这句话的意思,就相当于即使我们配置文件中,配置文件中不配置enable这个属性,不配置它的值,它值如果我们写出或false,我们即使不配置,哎,也是默认生效的,也是默认生效的,这就是match if Miss,然后呢,这个自动配置类,一句话解释它呢,就是来根据当前不同的条件。
19:29
不同的条件,然后呢,看我们当前是不是web应用啊,是不是类里边有这个类啊,是不是有了这些配置啊,根据当前不同的条件判断。然后呢,决定这个配置类类是否生效,那如果一旦生效了,我们这些判断都成功了,配置类生效了怎么办呢?来进来看一下,好,我们这个自动配置HP经coding的,如果说配置类生效了,哎,我们来看啊,它呢按特比应,按特比应啥意思啊,给容器中添加一个子件,哎,我们以前呢用过这种方式,好,我把它也放在这儿,Aunt being的意思就是呢,给。
20:14
容器中添加一个组件,添加哪个组件啊,就添加我们自己来new这个filter,把这个filter我们填过去,但是注意这个filter里边要获取字符集的名字,你是UTF8编码还是什么编码,它要从practice里边获取,就时呢添加一个组件,这个组件,这个组件的某些值需要从proper proper case中获取。中获取,哎,比如我们来看我们这呢,哎,它是要从这个属性,而属性呢,诶它是h properties,而我们这个including properties,我们以前也知道,诶它呢,其实相当于是它他已经啊已经和不是和和的配置文件映射了。
21:24
比如说呢,我们这个对象的值我们来点过来,你看它是获取配置文件中的值的,所以说呢,我们在配这个filter,你到底要用什么编码的时候,我从这里边获取的,而且大家注意我们这个con呢,只有一个有参构造器,在只有一个有参构造器的情况下。它呢,会从容器中,哎,只有一个有参构造器。只有一个有参构造器的情况下来,我们这个参数的值,参数的值就会从容器中拿,而容器中它怎么能拿到呢?相当于是前边的这个注解,这个注解呢,它的作用就是把它和我们配置文件绑定起来。并把。
22:19
HV properties,然后呢,我们加入到咱们这个IOC容器里。加入到我们spring的容器中以后,别人想用就能用了,接下来呢,我们这个自动配置类通过一个有参构造器把我们这个属性拿来,而我们这个属性它已经和spring boot的配置文件映射了,接下来呢,到底要用什么编码,就是拿到我们这个类里边的属性,所以呢,我们能配啥?诶,我们来看啊,它要设置编码,它是获取proper里边set里边的name值,我们来看一下,它是来获取properties里边,Properties里边有一个属性叫char set,诶char set里边的什么,它的这个name值。
23:08
我们来看一下,哎它这一块呢,有一个什么内幕属性,哎这个太长了,那我们就不看,然后呢,所以说以此类推,我们就应该能配一个spring点,能配什么呢?我们就照着它这个配,能配spring.HTp.HTTP.co还能配什么呢?首先enable的处,哎你能配这个,能配这个呢,就相当于是哎我们之前的这个判断属性,哎你即使没配这个,哎coding enable我也认为你是true后呢,还能配什么不点HTTP点,然后呢,有一个叫set,那实际上呢,应该是配set里的name,但是呢,这个set,哎这一块呢,我们直接可以来写我们这个utf杠八,然后呢,我们能配这个,还能配什么呢?我们可以来参照一下,还能配有一个叫force来是不是进行。
24:08
强制编码是不是要把我们这个请求响应啊,一定要变成这个U田花那也可以配,哎,第2HTTP第来这些。我们来注释一下我们能配置的,我们能配置的属性,属性都是来源于这个功能的。Proper类,然后呢,我们这个功能的proper类来封装每一个配置,包括呢,你这个配置你也可以直接点一下就能锁定到我们这个类,它现在呢,是生成的这个东西,好,我们点一下就能锁定到我们这个类,所以呢,这是我们的自动配置的这两项,就说有了我们这个自动配置类,我们自动配置类呢,就给容器中添加这个filter,这个filter呢,那就会起作用了,而至于怎么起作用的,我们后来讲web的时候再说,首先呢,它会根据当前不同的条件判断决定这个配置类是否生效,一旦这个配置类生效。
25:34
那么这个配置类要给容器中加组件就会小,这个配置类就会给容器中添加各种组件,添加各种组件,而注意这些组件的属性,属性是从对应的咱们这个proper piece类中获取的,而这些类这些类里边的属性的每一个属性,然后呢,我们在这filter用什么是通过这个properties获取的,而properties里边的每一个属性。
26:16
又是和配置文件绑定的,所以说啊,我们能配哪些,就是来看我们这个自动配置功能的这个类。这个其实就是的整个精髓,我们来说一下的精髓,这个精髓你要用好,怎么用呢?你把握这一点,第一点,首先呢,因为启动会加载大量的自动配置类,所以说我们要做的就是我们看我们需要的功能,功能有没有。有没有through默认写好的自动配置类,写好的自动配置类,哎,如果有我们再来看,我们再来看这个自动配置类中到底配置了哪些组件。
27:21
然后呢,Boot给我们容器中添了哪些组件,只要我们要用的组件有,那么我们就不用配了,只要我们要用的总价。有我们。我们就不需要就不需要再来配置了。但是如果说没有,如果说没有,我们当然就需要自己来写一个配置类,来把我们相应的组件配过去,包括呢,我们再来看第四个,也就是呢,包括我们这个给容器中,给容器中咱们这个自动类,自动配置类添加组件的时候,哎,会呢,从咱们properties。
28:17
Properties类中获取某些属性,而这些属性呢,就是哎,我们就可以,我们就可以哎在配置文件中制定这些属性的值,这些属性的值也就是说它跟配置文件绑定的,这就是的精华,那我们要用起来。然后呢,有非常多的这种模式,什么什么什么auto configuration。它呢就是来做自动配置的类,然后呢,它会给容器中添加组件。
29:09
添加组件,然后呢,也会有对应的叉叉叉,它呢来封装,封装我们这个配置文件中相关的属性,每一个功能都如此,比如说呢,Boot这个设计的呢,也是非常清晰的,比如我们要用自动配置,我们再来看有哪些自动配置,我再来搜一个芯,我们用CTRL加N打开这个快捷搜索,然后呢,我们来新auto conf auto con,我们来看呢,还有哪些自动配置呢?比如还有数据源的自动配置,比如呢还有as search的,比如还有卡的,比如比如还有缓存的等等,那随便来点一个缓存的好,那这个缓存呢,你看有相应的自动配置类那一些属性的值获取,哎,我们就来找一下,你看就相应的什么catch properties,哎,就有相应的属性,那么能配哪些?
30:09
就是能配指定的这个catch里边能配这些东西,所以呢,这就是我们自动配置的原理来,只要我们知道这个以后大家要用,其实从这以后我都可以不讲了,你就把握住一点,我看一下帮我们自动配置了什么来,如果没有我自己添加,如果有用它的,而用它的呢,如果哪些属性不满意,我们就在配置文件里边配置,配置文件里边呢,会有对应的properties来封装这个值,所以呢,这就是的用法。
我来说两句