00:00
那接下来就是我们该分析enable auto configuration的第二个核心注解了,叫import来导入,然后呢,它是利用select这个机制,再来给容器中批量导入一些东西,导入哪些东西研究清楚了,我们这个注解相当于就结束了,那它第一个呢,只是指定了包默认包规则,我们来看第二个导了什么,你点进来利用import这个select,我们给容器中批量导入,导哪些呢?一直往下翻,Select有一个方法叫select imports,就是我们到底给容器中要导哪些,这个数组里边规定要导哪些就导哪些,然后呢,所有的东西都是调用这个方法得到的,Get auto configuration entry,然后呢,Auto configuration entry在这呢,最终得到所有的配置,然后呢,转成四数组返回出去。所以我们只要研究清楚这个方法。好,把这个方法拿过来,所有的核心呢,那就都落在这儿,然后呢,它的这个作用就是,哎,利用我们这个方法给容器中,给容器中批量批量导入一些组件,那导入的是哪些组件呢?我们接下来就来研究这个方法,那这个方法的这个实现,我们就给它的这个实现上打一个断点,Get auto configuration entry,获取所有自动配置的集合。
01:20
我给这儿来打一个断点,好,我以得bug模式运行,我们把以前的断点都去掉,我就留这么一个断点,好,现在走到这,我们来看一下们来往下放行,往下放行,其中呢,这有一有一行话叫get connect configurations,获取所有候选的配置,如果我把这句话放行,大家会看到这个configurations,接下来在下边呢,要经常操作,把这个configurations先移出一些重复的,再从它里边排除一些东西,然后呢再来移除一些啊,我们要排除的,然后呢,再操作了一大堆以后,把这个congus会来封装,最终返回,所以呢,这个就是很重要,这个configurations里边呢,有127个说明,这127个全类面指定的组件,全部都是要导入到容器中的。
02:11
那我怎么知道这127个组件,它怎么就能是这么一个规则呢?好,我们可以来看一下啊,就是相当于我们这127个组件,它呢是要默认导入到容器中的,默认导入到容器中的,那怎么呢?但就是通过这个方法get connect configurations获取所有候选的这个配置。然后呢,它这个方法最终呢,又调用它来获取到所有需要导入到容器中的咱们这个配置类。导入到容器中的配置类,大家叫组件也都行那。他怎么知道是这些类呢?这个规则从哪来?所以你可以给这个方法来打一个断点,其他断点我来去掉,好来重新对bug。
03:05
来看一下这个规则又是出自于哪个地方。好,获取所有的候选配置来step into进来,然后呢,它其实是利用spring factory load,就是使用spring的这些工厂加载器,它会来加载一些东西,那我们就把这个再拿来,好,然后呢,利用咱们这个工厂加载,工厂加载一些东西,加载什么呢?我就详细的不整这么多了,我就直接点进去load function names,大家大概给大家一看,我们来要加载一些什么东东西的名字,然后load spring factor,我们再来点进去,然后呢,这一块呢,就是加载,最终就是利用这个方法会给我们加载得到一个map list。这个方法我来复制过来,然后呢,利用它用用工厂加载,比如说这个方法最终会加载得到所有的咱们这个组件,那到底是从哪加载得到的所有组件,那你只要看懂这个方法就行了,Load spring factor来进入到这个方法,我给他这打一个断点,然后呢,我重新对八个启动。
04:15
好,来到这,我看它是怎么加载的,我们来往下翻好,第一个result纤维空,呃,初始的啥都为空,然后呢,接下来是class load get resources,它相当于要获取一个啊资源文件,这个资源文件呢,这有一个resource location,那么资源文件的位置叫Meta info,所以呢,它其实是从这。我们相当于以上面的这个方法,是从从我们这个位置来加载一个文件的,那这个位置呢,相当于它就会默认扫描,扫描我们当前系统,当前系统里边所有所有这个未知的文件,所以呢,你就会看到在我们引入的这些炸包里边,那有些炸包呢,没ta INF for这个位置没啥东西,没有我们要的这个什么spring factories这个文件,但有的呢,就有比如我们来到spring的这个包下来看相关的包下,那它里边呢,就有spring factor有什么一大堆的东西,然后呢,除了这个包,有最核心的在这儿有一个叫spring boot auto confi这个包,我们把这个包拿来。
05:28
所以呢,我们把核心的都拿来从boot auto con,我把这个包来复制一下CTRLC。把这个报名呢,来拿过来,CTRLV,诶把这个包名。什boot auto figure来复制一下走,然后这个包,这个包核心呢,就是这个包里边它呢也有,这个包里边它呢也有我们这个位置也有指定的文件Meta英O,诶,Spring factor诶它也有,好我们可以把这个包里边呢,这个文件拿过来,包里边也有咱们这个Meta info。
06:08
Factor,而这个里边呢,最核心的内容就过来了,大家看,我们要加载127个这个东西,它其实是在文件里边写死的,在哪写死呢?在这其中呢,有一个配置项叫enable auto configuration,诶,大家发现居然跟那个注解是全类名的,对吧?所以那个注解要加载哪些类呢?接下来在这有配置,然后呢,每一个都是一个换行符,都是一个全类名,它们都叫什么什么什么auto configuration,什么什么什么auto configuration,什么什么auto con auto configuration,就是什么东西的自动配置,什么东西的自动配置,Book兼容到全场景的自动配置,它全在这列举过来了,总共有多少个,大家看,从22行一直到我们的这个。148行,那总量呢,就应该是148减去22再加一,那正好呢是我们127个,所以呢,我们所有这就是我们说的所有127个自动配置类的。
07:09
这个东西在这儿,然后呢,它是通过这个机制,其实就是在配置文件里边写死的,对吧,比如说配置文件里边写死了。我们一启动要加载的,哎,咱们这文件里面写死了,写死了,我们spring boot1启动,SP boot1启动。一启动就要给容器中加载的所有配置类来,就是这些我全部把它粘过来,但是实际上呢,实际上呢,这个东西它的真正位置就是在BOO auto confi这个包,Meta info这个里边,我们把它它的这个位置拿过来。但是问题就来了,你要真把这么多全加载进来,我们此轮boot容器里边都可能都没有这么多组件,我们给大家看一下啊,我们之前在慢方法测试的时候,我们BT容器里边哪有这么多呀?你说一股脑的加载那么多,我们真的就有这么多get,我们这个be应看有没有count DeFinition count,获取所有being应定义的总数,我们到底在容器中有多少个组件。
08:22
我们来给大家看一下,走。哎,我们看到呢,有134个组件,这134个组件呢,还不是那个里边的,可能还包含我们乱七八糟的一些其他东西,所以呢,真正的也就是说我们boot,虽然你说一股脑的把这些东西全加载进去,但是哪些生效,哪些不生效,就是我们接下来要说的按需开启。虽然。我们127个127个场景的所有自动配置,自动配置启动的时候,启动的时候,启动的时候默认全部加载,默认全部加载,但是呢,最终最终会按需配置,怎么个按需配置办法,来我们来给大家分析一下。
09:20
随便点进一个,我们来看让它加载吧,反正呢,Super boot auto confi,好,我们不看Meta info了,反正它要加载的这一类都在这写着呢,比如amqp,比如我们这个oppp,就是做切面呢,我来点开,那切面能不能,我们的这个AOPP功能能不能实现呢?其实不能,为什么呢?因为它这有一个叫conditional on class,诶这是不是叫按条件呀,而且呢,这个按条件的意思就是我们整个这个这个相当于我们这个应用类路径里边存在这个类,我们接下来的这一堆的配置才生效,你看这一堆有JDKCGD自动代理的一大堆的东西,所以我们的这个a op才能生效,那什么时候才会有这个类呢?你只有导了AOP相关的包,大家看这个类呢,是unpect接这个包,你只有有这个包的时候才会有这个类,有这个类这些自动配置才生效,另外批处理能生效。
10:20
好吗?这有一个be auto configuration点进来批处理也不能生效,因为我们都没有导批处理相关的这些场景,自然也没有批处理相关的这些类,也没有这些包,所以也不能生效,包括我们访问数据库卡sanra能生效吗?点进来我们把卡sanra相关的这些类我们都没导进来,这些类都是发红的,对吧?我们在类路径中都没有,所以也不能生效,虽然它一股脑的加载了所有,但是呢,最终得益于spring boot的什么按需加载的这个注解,就是我们说的条件装配,得益于这个条件装配好的东西呢,并不能完全开启,所以呢,我们说这就是我们spring boot自动配置的核心启动呢,加载所有,哎,直接写死了,给你加载所有场景的自动配置,但是呢,最终按照条件装配,按照条件装配规则,按照条件装配规则最终会按需配置。
11:19
好,那至于我们这个具体的内容,我们下节课可以按照几个自动配置实例,我们来分析一下就行。
我来说两句