00:00
好,那前面呢,我们通过分析enable auto configuration注解,然后呢,翻译过来就是开启我们自动配置功能的注解,哎,我们知道了,这个注解呢,通过import帮我们导入了,在初始一启动就导入了127个的这些自动配置类,当然呢,这127个自动配置类又不能尽数生效,因为呢,每一个自动配置类里边,诶,我们之前点进去都能看到,它们是利用at conditional这个注解,也就说我们的条件装配注解,它来判断,只有条件生效的时候,我们的这些自动配置类才能生效,那么接下来呢,就通过分析上两三个,一些生效的,一些不生效的,我们看他们怎么进行工作,好来到我们的这个代码里边,我来找到我们spring boot auto confi这个包,Spring boot的自动配置包,这里边呢,有我们的这个con auto confi这个包里边有我们全场景的自动配置,但是呢,通过我们这个分析,比如我们来打开A,来到a up auto confi。
01:00
来分析一下我们的这个AOP功能,AOP的这个自动配置是不是能生效,首先呢,我们来确认,CTRLC,我来CTRLF,我来确认,搜索一下我们的这个AOP的自动配置,它确实呢给我们导进来了,好,这127个包含它,那我们AOP是否生效呢?诶,我们来在这看,首先呢,他说哎,我是一个configuration配置类,我们之前讲过它的原理,然后呢,接下来他又说conal on property,意思呢就是我来判断配置文件中是否存在spring.AOP。的这个配置,如果呢,存在了spring.AO这个配置,并且它的值是true,那我们下边就生效,而且呢,人家多说了一句match if Miss说就算你没配,我也认为你配了,认为你配的这个值呢就是true,所以呢,相当于我们的这个A自动配置,它生效了,生效了呢,接下来我们就来进行判断,这呢有两个class。
02:01
我们把这两个class展开好,我们把这两个class展开,第一个class他呢说还自己还是一个配置类,然后呢,但是conditional on class,你的整个我们的这个应用里边,你是否存在advice,也就是存在这个类,我们来CTRLC们来搜一下CR v advice的这个类,我们来看一下啊,这个类不是op这个包下的,而我们的这个advice都发红了,它是aspect接这个包的advice,但是呢,因为我们没导入AOP场景,所以UN aspect接的这些依赖我们没有导进来,所以呢,相当于我们这个自动配置类,哎,我们的这个auto configuration它呢没有生效,那没有生效呢,它里边所有的这些写法其实也就不能生效了,所以呢,我就把这个类关了,诶下面里边的这个东西呢,暂时呢就没啥意义了,然后呢,再来看这个里边的,这个里边的它呢,这个类说我也是一个配置类,因为我们的种类生肖了。
03:01
所以下边的这个小配置类也生效了,然后呢,他说conditional on missing class,就说呢,当你系统里边没有这个类的时候,那巧了,我们正好就是没有这个类,我们正是因为没有这个类,所以unpect接这种自动代理的A模式没有生效,但然这个A的内部原理我们在之前spring注解这个课课程里边我们也讲过,然后呢,我们来看,也就是说我们SP接的这种代理模式没生效,但是呢,他又判断conditional on property,你在我们的这个配置文件里边是不是配了spring.AOP然后呢,这个属性,这个属性它的值你是不是配的是处,如果是的话,我们就生效,而且如果你没配,我也认为你配了,所以呢,它相当于也是默认开启了我们的AC功能,只不过呢,它开启的是简单的A功能,就是呢,我们的这个A必须有接口,有实现类才能帮你创建代理对象的,那这一块的啊这个原理。
04:01
我们也是在spring注解的那一块,我们A原理的时候有讲过,那我们这一块呢,就不多说了,也就我们能看到有些东西呢,它是在我们条件下能生效,有些呢不能生效,那我们再来看一个不生效的,来到我们比如这个catch,我们缓存是不是生效,我们的未来在系统里边会经常见到什么,什么auto configuration,这其实都是spring boot的一种设计规则,只要你见到后缀是auto configuration代表呢,我就是一个自动配置类,我会帮你配好所有的东西,但这个自动配置类能不能生效呢?来看一下。首先这个自动配置类也是我们BOOT1启动一定是默认加载进来的,我们来CTRLN搜一下,我们spring boot1启动CTRLF来搜一下它有没有加载我们这个自动配置类,诶在这看auto comp也是一启动就加载了,要放在容器中,现在我们这个配置类要放在容器中,要变为容器的组件了,但是这个配置类要不要生效,我们再来看效果,首先第一个叫condition的on class,先看我们这个,呃,整个应用里边有没有这个类的存在,有一个类叫catch manager,好,我们crl c controlrl n,我们来找一下catch manager,这个catch manager呢,它是我们这个spring contest有我们spring整个上下文环境这个包里边的,这是我们的核心包,所以说呢,我们这个是有的,相当于我们缓存管理器这个类有,然后呢,还有conditional on being,我们判断容器中是不是有这种类型的组件。然我们以前on being呢,是拿。
05:37
组件的名字判断的,当然你也可以判断容器中有没有这种类型的组件,那有没有呢?我们来确认一下,怎么确认呢?我可以来到慢object里边,我来写上一一行代码,我从容器中run来,因为我们整个应用器启动,给我们返回这个容器,我从容器中调用这个方法叫get be name获取我们这个组件的名字啊,按照类型获取,它会返回我们这种类型,在容器中到底有多少个组件,把它组件所有名字的数组都返回,所以我们来get be names for type来找一下。
06:11
重新来点一下,点一个get being name for time,那我们就来找这种类型的。我们来看一下这种类型的组件在容器中有没有还是有几个,那我先来简单输出一下,来看一下它有几个,就是这个for type的数量。那为了我们这个能一下找到我们这行打印期间,好,我来画个等号。走。我们来看一下我们这种东西呢,在我们这个容器中有多少个。哎,我们发现呢,它在容器中有零个,也就是说呢,我们想要做缓存,但是我们容器中没有配置,按照翻译就是没有配置缓存切面的这个支持这个组件,所以呢,我们下边的这些东西我们就不用考虑了,缓存整个下边的所有这些配置,我们看到ant毕竟就是给容器中加东西的,Ant毕竟是给容器中加东西的,那我们整个这个类上的这个条件判断都没生效,那你的方法里边要给它里边加东西也不会生效,所以说呢,我们这一块的加东西就没有生效,那没有生效在接下来怎么办呢?我们可以也就相当于我们的这个缓存的整体配置全部都没有生效,这就是我们判断的有一些东西它没有生效,然后呢,我们再来判断哪些生效了,我们现在是来开发spring mvc啊,我们开发一个web应用,肯定web相关的东西生效了,那我们就来往下找web模块,诶,这有一个web模块好点进来,然后呢,So,我们来看一下。
07:44
里边有没有什么auto configuration,诶我们看翻译,哎,我们看这翻译呢,这有挺多的关于web的这些自动配置,那首先第一个自动配置叫dispature solid select auto compfiguration,那么就点进来,点进来以后呢,我们来看它里边的这个写法,它呢说我也是一个配置类啊,我们以前用过,然后呢,它的条件就是conditional on web application,判断我们当前是不是一个web应用,而且呢,必须是原生serveul的类型的web应用,因为我们说spring boot2现在支持两种web模式开发,一种是响应式编程,一种是我们原生serveul技术站,而我们现在呢,导入的就是原生soulet技术站,响应式编程导入的不是我们这个start web模块,应式编程呢,导入的是start web f flux,那我们之前在这个简介的时候,应该都说过我们的这个响应式,我们来看一下啊,我们这个响应式呢,它导的是这个web f flux,而我们这个原声呢,就是。
08:44
导的是web模块,所以呢,我们现在确认就是原生的web开发,然后呢,接下来他判断你当前系统里边有没有这个类,比说你我们有没有导这个类叫disp,哎,我们只要导了spring mvc肯定有这个类,因为这个类呢是spring mvc包里边的,哎,我们能看到是spring web mvc这个包里边的,所以呢,相当于我们这个配置就生效了,其他这两个呢,其他这两个注解,哎,我们暂时可以不用改,一个叫o confi啊confi,我们的这个O相当于我们这个配置类的配置顺序,诶它是先生效呢,还是后来生效,然后呢,接下来这是相当于指定优先级的,这还有一个叫auto confi after after的意思就是在什么之后,也就是说你在这个东西auto configuration,在这个东西自动配置类,配置完之后再来配你,相当于我们想要配置web,首先得让人家的这个东西叫so web server,相当于让让web服务器先配好。我们才。
09:44
能配Dis,所以呢,我们看到我们的这个条件盘呢,只要成功了,那接下来我们再往下看,往下看呢,这接下来有一个配置,好说我是配置类那种类这块能成功了,我们才有必要看下边,看下边呢,我们接下来挨个分析,我是一个配置类,然后呢,我现在condition的我要求啊,我要求呢有这么一个条件,这个条件呢才能生效,我们后来再说这个条件,然后呢,接下来有一个叫conditional on class,就是我们系统中有没有这个类型的组件,诶我们现在呢,就是web开发这个类型的组件,我们来看它呢,就是导入了tomcat核心包以后就会有,所以我们有这个东西,所以我们就生效了,然后接下来呢,大家熟悉的一个注解叫enable configuration properties,这个注解我们说两个作用,第一个作用就是开启我们这个类的。
10:35
跟配置文件的配置绑定功能,相当于我们这个类。Web mvc properties点进来,它会跟我们配置文件spring mvc这个开始的所有属性进行一一对应,进行绑定,也就是说我们配置文件里边这个前缀里面的所有属性都会被它封装,这是第一个功能,第二功能把我们这个这个类型的这个组件,既然把配置类,把我们配置文件里面的值都封装好了,然后第二个就是把它放到容器中,所以容器中呢,以后会有这个类型的这个组件,所以我们可以不妨来在我们这个容器中来检查一下,来检查一下run一个来让第2GET being name for type来我们就来检查一下web mvc properties这个类型的组件在我们这个容器中有没有,然后呢,我们来C4OUT啊,我们来打印一下它的这个多少就行了,数量。
11:36
也就是说呢,它相当于我们配置文件里边跟spring mvc有关的配置全被封装到我们这个东西这个类型的组件里边了,哎,我们来看啊,有一个,哎,确实有一个,所以呢,接下来我们来继续分析,至于它封装了什么内部原理,我们后来在专门讲web的时候再说,然后呢,接下来我们来看,既然我们这个配置类生效了,这两个条件呢,第一个我们说这个是默认生效了,我们不用管,第二个呢,我们判断它是生效了,第三个呢,只是相当于把配置文件跟它进行绑定了,没问题,然后接下来第四个an b,它里边呢就有方法,An b就是给容器中干嘛,是不是给容器中。
12:16
配置,配置什么呢?给容器中注册我们这个类型的组件,然后呢,而且大家注意它是怎么注册的,自己拗了一个PAR,然后呢,把相关的这个东西全部设置好,设置好了以后呢,RETURN1返回,所以就解决了我们一个疑问,我们以前spring spring mvc我们要做的这个东西,我们还要在配置文件里边写一大堆,我们要把它放在容器中,但是现在呢,其实相当于人家底层帮你拗好了这个对象放到容器中了,所以不是说我们不用配了,而是底层帮我们配好了,你如果真正从头到尾啥都不做,底层也帮你不配,那肯定是没有这个功能,所以我们spring mvc的核心dispure sol,那就是配好了,然后呢,而且dispure sol用的这个组件的默认名字,你点过来,哎,就是就叫dison,然后呢,他还帮我们配什么,配了一个叫multi part serve,大家学过spring MC就知道这是我们什么,这是我们的。
13:17
文件上传解析器的内容只它呢是怎么配的,叫conditional on being,也要说你容器中有这个类型的组件,那巧了,我们没有这个类型组件,我们自己应该也没弄过,所以他他意思就是我们容器中有这个类型的组件,然后呢,他又说容器中有没有这个名字的组件,这个名字呢,叫multi partt reserver,那这两个反映了一个什么意思呢?就是说我容器中虽然有了一个multit reserver,但是呢,你的名字却不叫multi partt reserver,然后我怎么办?然后呢,这写了一个方法,把方法的参数直接返回,哎,这个方法的意思,哎,这个方法就比较有意思了,老师可以在这儿呢给大家稍微解释一下。
14:03
我们再来探索这个底层的时候呢,哎,我们发现了它的这么一个写法,它有一块呢生效了,这是相当于给容器中,给容器中加入了,加入了咱们这个文件上传解析器,解析器我们文件上传功能就能用了,但是它是怎么加的,这两个条件判断分别是当容器中有这个组件,容器中有这个类型组件,容器中有这个类型组件,但是呢,我们以前也用过这个,但是容器中呢,没有这个名字组件。容器中器中没有这个名字,哪个名字呢,就叫multi part reserver,我们来看一下这个名字,点过来就是小写的multi partt reserver,但容器中呢,没有这个名字的组件,然后呢,我给你干嘛,他调了一个方法,这个方法呢很神奇,传了一个参数,然后呢,把这个方法传过来的参数最终返回出去,然后呢,把这个方法的返回值又放在容器中,所以说这就是我们说的,哎,我们这个spring boot给我们容器终注入组件呢,如果你调用的这个方法传了一个参数,这个参数呢,它就会默认去容器中找,所以这个参数啊,你不用传值,如果我们传入了给方法传入了参数,给at being的at being标注的方法传入了对象参数,然后呢,这个这个这个对象这个。
15:39
参数的值,这个参数的值就会从容器中找,它怎么从容器中找呢?就是它自己在容器中找一个multipart reserve这个类型的对象,然后呢,给你reserve赋值,赋值完以后你再返回,那他整个这个行为其实就做了一件事,就是呢,我们以前用spring m VC,我们要给文件,我们要配置文件视图解析器,是这个文件上传的解析器名字必须叫这个,但有很多用户可能不知道这个底层的默认行为,所以它配的这个文件上传解析器名字不叫这个,不叫这个以后呢,我们在spring boot里边也能解决这个问题,就是说你即使你自己给容器中配了一个文件上传解析器,但名字呢,没有按照人家规定起,我也能从容器中给你找到你配的那个视图解析器,然后把你的这个解析器返回出去,所以呢,相当于s springr m做了这个规范化,就是防止我们有些用户,防止有些用户。
16:39
些用户配置的视图解析器配置的,哎,不是视图解析器配置的文件上传,咱们这个解析器文件上传解析器,就你配的这个文件上传功能不符合规范,不符合规范人家呢,就给你把你配的这个不符合规范的文件上传解析器,因为你的名字没叫它,然后我给你再返回出去,一返回出去以后呢,名字又叫它了,为什么名字叫它了呢?因为我们方法方法的这个名字叫multi part reserve,所以呢,这就是哎我们这个比较有趣的一个给容器中注入组件,好,所以说呢,我们看到了dispar light,相当于它也自动的配置到了我们的哪个里边容器中,而且也给我们这个容器中配了一个multi partt reserver,然后呢,包括它在下边你们看at b给容器中其实放了很多的东西,当放的这些东西到底是什么,我们后来还会详细解释,然后呢,再来接下来啊,这儿有一些什么进出规则啊,这个规。
17:39
规则其实就是我们前面在这儿啊,为什么我们这个规则会生效在这儿,在这儿它呢,是利用自己的一段代码来进行规则判断生效的啊,这段代码呢,它表示的意思我们在spring注解版里边啊,我们的这个condition的注解也会给大家讲,大家去来参照就行了,所以我们分析了第一个开启了配置的,然后呢,我们再来分析第二个,然后我们发现呢,这还有一个叫htp in coding auto con,那就是HTTP编码的这个自动配置,那我们现在呢,我们经过我们测试,我们的整个请求响应是不乱码的,包括如果大家想测试。
18:17
我们可以给这个请求这一块,我们来看一下,我们让他传一个中文参数,我们看乱不乱码啊,然后比如死砖,我们传一个name,你好谁谁谁,我们给他打个招呼,这个name呢是请求参数,我可以来要求一下request PAR入是请求的这个参数,这个参数名呢,你就给我叫name,你给我请求参数上带一个name的这个参数名,你给我name叫什么,我就给你谁打招呼,好我们就来访问一下它问号name等于比如我们来叫张三来看传中文参数,哎,中文参数呢,我们是不乱码的,哎没问题的啊,没问题的原因就在于我们这有一个HTP引扣的HTTP,咱们这个编码的自动配置,这个编码的自动配置它是怎么配了呢?它就在这儿来进行配了看,然后呢,一个是说我是一个配置类,然后呢,相当于我们这个配置类里边,它又开启了这个类跟我们配置文件版的绑定,我们后来再说,然后呢,它做。
19:18
做了一些,主要来看这些判断条件,判断我们是不是原生的select应用,我们是没问题,然后呢,判断我们这个,呃,容器中我们这个应用中是不是有这个,哎,我们只要倒了spring mvc这个炸包,我们肯定有这个filter,走我们看一下,哎,我们肯定有这个filter,所以我们这个类里边有这个,然后呢,看你配置文件中有没有配这个属性,然后呢,你这个属性呢,即使你的这个属性的值是不是叫enable,如果没配也认为你是配了,所以呢,相当于我们这一块的判断都是生效的,生效以后你看它给我们改了什么,An b是不是给我们容器中放了一个叫开coding filter,这个filter大家如果做过就知道这是什么,这是我们spring mvc用来给我们解决请求的什么请求编码问题的,也就说呢,如果你的这个请求发过来的这个请求啊,你没有这个filter拦截的话,它就会乱码,只要我们填了这个菲,那就不会乱。
20:18
而且呢,它这个条件就是你容器中conditional啊Miss PI,就是你容器中如果没有配这个我就帮你配,所以呢,意思就是你容器中配了,那我就不配了,那也就是说人家即使是按需开启这个自动配置,而且呢还是你如果配了我就不配了,语音用户配的优先,如果用户没配,底层帮你配好,所以我们看整个底层源码,我们发现了spring boot的一个设计模式,所boot的一个什么设计模式呢?就是默认。Spring boot默认会在底层,底层配好所有的组件,但是呢?但是但是如果,如果用户自己配置了以用户的优先,用户自己配置了以用户的优先,为什么是以用户的优先?那就在这儿我们经常会大量见到condition到on missing being,就是当容器中没有这个东西的时候,我才给你配,有了你配的是什么就是什么,那用户怎么自己配啊?那就是我们以前的你想自己配了,你给你的conig里边,你不想让用人家的这个字符编码过滤器了,那你就自己在这写一个currentco filter,对吧,Co。
21:41
Filter,对你自己呢,写这么一个filter,然后呢,你给它return过去,然后呢,你给它加在容器中,相当于你的就有了,你的有了那就用你的,所以这就是我们说的boot在底层自动配置的整个规则,那么总结起来,哎,总结起来就是就是咱们这句话总结起来,那就是spring boot先来加载spring boot先来加载所有的自动配置类,先加载所有的自动配置类啊这是第一步,第二步,然后呢,每个自动配置类,自动配置类按照条件,按照条件进行生效,不是全部生效,然后呢,接下来第三步,如果生效,如果这个配置类生效了,然后呢,生效的配置类,比如我们生效的这个htp including的这个filter,这个auto。
22:40
我们生肖的这个配置类就会给容器中配装配很多的组件,生肖的配置类就会给容器中装配很多的组件,然后呢,接下来只要容器中有这些组件,相当于这种这些功能就有了,只要容器中有这些组件,相当于这些功能就有了,就相当于我们以前spring spring mvc那些整合一样,我们要给这个配置文件里边配好多好多的这些组件,那你配了这些功能才有,只不过我们spring boot底层把这些都配了,而且呢,它还有一个默认行为,是什么行为呢?那就是只要用户有的,只要用户。
23:29
有自己配置的就以用户的有限。也就是说我们即使想要定制我们的这些组件也非常方便,你看人家底层配了你也别害怕,你想要换了,直接在这按特鼻影加一个自己的就把它的换了,所以呢非常方便,这就是我们说的自动配置,那更激动你人心的就是我们会大量看到每一个自动配置类一生效以后,他还爱干的一件事就在这儿,他呢还经常会开启一个属性绑定我们配置类里边,大家看啊,它给我们配了咱们这个,呃,相当于字符编码,但我不满意它的字符编码,编码呢,它现在是UTF8,我某一天想变JDK了咋办?这些其实都是可配置的,在哪可配置,它相当于大家看啊,它在给这个过滤器对这字符编码,过滤器设置字符编码的时候,字符编码的值从哪来?是从这个里边来,那这个里边的东西又是从哪来,又是从我们的这个叫。
24:36
Server properties里来,而server properties大家看啊,Server properties里边获取到so的en includingding就是的这个properties,然后这个properties最终得到的字符集的名字就是我们按编码名,而我们的这个server properties它其实是绑定了什么的配置文件的,所以说呢,每一个配置类一生效,它默认一般默认都会绑定一配置文件,配置文件指定的值。
25:08
指定的值,所以呢,这就是什么模式,我们会见到很多的叉叉叉叉auto configuration,然后呢,这些configuration里边凡是要配哪些组件,这些组件呢,这些值经常爱变化,但是爱变化的这些值都从哪来,就从相应的叉叉叉叉properties里边来,所以我们未来又会看见非常多的properties,比如我们在这web配置的时候,Disppaure so的自动配置,大家看dispen so late。它的这个自动配置,哎,它想要给这自动配置,它呢也会绑定一些什么什么properties,然后disppa select里边所有的这些值,大家看是不是都来源于web mvc properties它里边的东西,Web我们都说这个方法里边,诶方法里边传的这个参数的值是从容器中拿的,而容器中web mvc properties它是enable这个configuration properties导入进来的,所以说这个自动配置类里边所有的值都是从叉叉叉叉properties里边的。
26:14
里边的,然后呢,而我们这个叉叉叉properties又是和叉叉叉properties又是和配置文件进行了绑定,和配置文件进行了绑定。所以呢,我们想要定制化配置也非常简单,两两种办法定制化配置,定制化我们这个配置两个办法,第一个办法。就是我们用户,用户直接自己自己按B一个组件替换原声组件,自己用户自己,然后呢。使用an b替换。底层的组件,这是第一种办法,第二种办法那你修改配置文件就行了,人家底层的这些组件其实都不用你创造了,人家把这些它能变的值都给你抽取出绑定到配置文件里边了,所以说其实第二种大家更常用,我们用户去了去看咱们这个组件,这个组件是获取的配置文件什么值,配置文件什么值。
27:21
什么值就去修改就行了,所以呢,如果我想修改字符编码的值,那也非常方便,那一定是修改server servecoding里边的东西,所以我们来看啊,我们可以来看我的这个字符编码怎么修改。Server server including,第二一个,这不就有叉set了吗?我们有UTF8,有JBK,你想改什么改什么,所以这就是我们说的整个自动配置的核心原理,从叉叉叉autoconfi给你导进来,给你把好多组件装配进去,这些组件呢,又从properties里边拿值。整个流程就是这样,叉叉叉autoconfiguration,然后呢给我们导入了很多的组件,然后呢,这些组件又从叉叉properties里边拿值。
28:11
组件,然后呢,叉叉叉proper里边拿值,然后呢,叉叉叉properties,叉叉叉properties,它呢又从我们的这个application properties配置文件里边获取,所以呢,我们以后一般性改配置文件就能改掉我们所有的这个默认行为,这就是我们整个的spring boot自动配置原理的流程,从我们一初始导入了所有的自动配置类,按需加载了所有的组件,组件从我们properties里边拿值,但properties其实绑定的就是application properties里边的值,因为我们会大量看到这些enable configuration properties这个注解,这个注解什么意思?哎,我们之前都说过了,对吧?这个注解就是这个意思在这,哎,他跟谁绑定呢?又跟server绑定,所以如果我们想改dispature serve相关的,诶,我们刚才这个server properties是咋进来的?
29:04
我们看是谁里边的啊,Enable configuration好,是这里边的,是这里边的,所以呢,我们想要改这里边的,相当于就是来改我们server下边的配置,那要详细一点,就是server server light里边的配置,所以说呢,我们等等等等所有的东西其实都是在跟配置文件在这建立起了关联,而配置文件里边,所以以后大家会。会想我只要会改spring boot的这些配置文件了,现当我整合出啥场景,我都能修改它的配置了,那配置文件到底有哪些种改法,那我们以前又说过在这个附录里边呢,人家都给你抽取了各种场景,啥配置文件代表啥意思,其实呢,第一种办法就是你查文档,第二种办法你文档也不查了,我们就直接查底层,对吧?我现在比如我想配缓存相关的了,好,我点开缓存,我也不用打开官方文档,点开缓存的自动配置,哎,我看缓存的是跟这个properties看跟这个properties进行了绑定,点进来,然后这个properties里边配了,哎,是以这个为开头的,所以我们缓存有关的所有配置,那我们就以它开头来进行配。
30:16
Spring catch第二什么也有提示,如果我们用red做缓存,Red缓存相关的配置都在这儿,所以我们只需要学好各个技术就行了,这些技术至于怎么整合进来,怎么配,我们完全不用管,我们学好技术以后想改配置,一句话的事情,哎,这就是我们spring boot给我们开发整合带来的其他方面,也是它的整个自动配置原理。
我来说两句