00:00
好,那最后呢,我们来说一下spring BOO原理,首先spring boot它不是一个单纯的框架,它底层呢整合了非常多的技术,比如我们说的STEMMVC,以及STEM的整个系列技术站的其他技术,甚至一些第三方框架,所以呢,我们要完全搞懂我们是如何使用spring boot,包括我们如何做其他场景的开发,其实我们要走的路还是很长,当然呢,从大的层面来说,我们需要懂得这几个原理,首先第一个是spring原理,Spring原理呢,我们上硅谷之前发布过一个spring注解,它基于SPRING4来讲解的spring底层原理,那现在呢,我们spring boot2版本,它底层呢使用的是SPRING5,那如果想要关注SPRING5的更多原理,大家也可以来关注我们大厂学院,我们在里边呢继续给大家解释,以及我们spring m VC的原理,我们在之前讲web开发的时候,我们在里边呢,大量讲解了spring m VC来处理web请求的原理,但这一块spring m VC呢,我们确实是基于spring mvc5版本来进行讲解。
01:01
的,然后呢,这以及它的自动配置原理,那自动配置原理呢,我们在前边在核心技术基础入门的时候,我们就已经说了自动配置原理,看起来叫了解自动配置原理,但是呢,我们其实在后边把整个自动配置原理的过程,我们全部呢都说清楚了,那如果大家在这一块呢,已经忘了自动配置原理的过程,那也可以来回顾这个章节,所以我们现在呢,就来从大的层面来说,我们最后再来给大家来串一下s boot的整个启动原理,也就剩下了我们这一块的原理,我们boot从这一块入手,我们给前边给大家分析了spring boot的自动配置原理,那我们接下来就来看我们整个spring boot应用,它是怎么启动起来的,它启动过程中又干了哪些活,所以我们接下来就来研究一下它启动原理,那我呢还是以debug断点打在这这块,启动原理呢,大家要额外注意一些,因为我们boot在启动整个应用的过程中,我们有非常多的时机,这些时机呢我们有可能需要自定义。
02:01
接活需我们需要一些回调机制来完成这个事情,所以smart boot对底层这个能力也做了支持,所以我们在来调试boot整个启动过程的时候,注意以下的这些东西,比如有一个什么东西叫listener呢,引initial拉,ER呢,初始化器啦,监听器啦等等,他们呢都是在我们合适的时机,他们会来进行回调,那么现在就来看整个启动过程,我给这儿呢打了一个断点,现在以北8UG模式来启动运行。我们来看spring boot应用是怎么启动的。好,那们先来到我们这一块,我们的整个完整的代码是spring application run们一传入我们的主配置类,我们就开始运行spring的应用,那怎么运行呢?我们来step into进来,那进来以后呢,它首先是用一个class把我们这个主程序类传来,然后调用run方法,我们就直接进入它的run方法,这样run方法呢,首先第一步它们呢会创建spring应用,然后呢,第二步把spring的这个应用再跑起来。所以我们整个的启动过程,我们先分为两大步,第一步创建spring应用application,然后呢再来运行spring application,那这两大步里边又做了什么,我们就逐行分析,首先我们来分析创建spring application干了什么?好,我们来step into,它给我们传入的呢,是我们主配置类,我们来step into进来,然后呢,它调用this有参构造器,传了两个参数来step into进来,这个this里边呢,我们会看到它初始化了很多东西,我来往下走,这一块来到。
03:34
Application里边的好多属性,好我们要创建对象的这些属性先得初始化过来,好我们先不用管这些属性,我们来到我们的这个类里边,好首先呢,它保存了第一个属性,我们的这个资源加载器,然后呢,接下来第二个它在这sert相当于来进行断言,断言呢我们这个有主配置类,我们这个主配置类有,如果你没有的话呢,他想给你抛一个10万,说你没有指定主配置类,然后接下来呢,把这个主配置类的信息先保存起来,然后在当前的spring application这个类里边,它呢保存了当前我们主配置类是什么?就是BOOT09 hello test application就是它,当然这个主配置类里边最核心的就是我们通过这个注解开启了整个自动配置功能,当然我们这块呢,就不用分析了,那主配置类现在记录了以后,接下来它再来在这儿保存了一些属性,所以呢,其实我们这个创建对象最核心的就是啊,保存一些保存一些信息,而这些信息。
04:34
包括什么呢?来看一些关键的这信息呢,其中里面还有一个叫web obb type,它来决定我们当前的这个应用的web应用的类型,它调了一个web开成type方法啊,第六它来判断我们当前web应用的类型,来step into进来看它怎么判断的,它呢相当于判断用它类工具类class us,其实我们在看源码的底层的时候,我们会发现非常多有用的工具类,比如人家用来做我们class的一些工具类class u呢,先会来判断我们当前这个系统里边有没有导react,相当于是响应式编程的的我们的这个整个请求处理器,但是呢,我们现在呢,不是响应式编程,如果是响应式编程,我们整个应用就会返回,它是一个响应式编程,而我们现在呢,是原生的so编程,所以呢,我们接下来在这呢,就会返回一个web application type叫S。
05:28
那我们现在呢,当前应用的类型,当前外围应用的类型是一个so,所以呢,它在这整个呢期间先做的第一件事。哎,我们这些工具类呢,我们可以给大家留在这儿,他做的第一件事,他呢决定我们他来,他来判定当前应用的类型,主要呢,就是用这个工具类来判定的,那我们当前的应用类型呢,我们一般就是sol,哎,我们当前是一个sol应用来进行web开发的,然后接下来呢,在这又准备了一个叫boot strippers,这相当于一些初始启动器啊,我们可以把它叫初始启动器,什么叫初始启动器呢?就是项目一启动我们就要干什么的,而这些初始启动器呢,它是这么来做的,大家来看啊,它叫get spring factory instance,下面呢,它调用这个方法,然后呢,把我们这个类型传过去,然后在这来记录一下这个about strips点进来,它呢还是一个list list里边呢,都是这个叫boot driver,点过来把这个拿到它呢,想要获取所有的这个初始化启动器,这个初始启动。
06:38
输入启动器是什么,我们看它怎么获取的step into进来,它调用这个get spring factory instance这个方法获取的,我们再来点进来,它相当于想要获取我们这个boot strippers,然后呢,我们再来step进行图进来,他呢先拿到类加载器,然后呢使用一个spring factory loads这个东西呢,我们以前其实在讲自动配置原理的时候讲过,这个东西呢,Small factor loads,就是从small.factor那个文件里边来读取这一类,所以我们来看一下它是要读取哪些类呢?是来读取这个叫butri,但是呢,我们在这一块看一下,Names等于零,就说它相当于会去来找所有的这个spring.factor这个文件里边,看你有没有在这配,我们这个称为什么类型呢?来看啊,称为叫这个类型叫boot strippers,所以呢,我们如果想要让项目一启动以后有一些启动类,所以我们在这一块它的这个找寻办法。
07:38
就是去咱们这个spring.factor文件里边,Factor文件中找,找这个类型的,找我们这个Bo driver类型的,那我们这个呢,没有没有我们就不管,说明呢,我们当前类里边所有的炸包里边都没人配置这个东西,那如果有配置的话呢,他就会把这些东西创建一个实例,把这些实例呢给我们返回,而我们现在呢,没有任何实例说明我们的项目初始化启动,没有任何初始化的这个引导器啊,这是我们初始化的启动引导器,初始启动引导器,那我们这个工具呢,我们暂时就不用管,然后接下来这又有一个核心叫set initialize,哎,我们initialize呢,我们翻译过来叫初始化器,那它呢,还是这个方法,Get spring factor instance,如果大家以后呢,都见到这个方法,Spring factor instance它们呢?
08:38
都是去spring factories这个文件里边去来找,看你有没有相关配置这个类,它的值是什么,所以呢,它这一块将下来,它又找一个叫初始化器找找这些,它这些的找法呢,也是去我们说的spring factories这个文件里边找,去spring factor找找什么呢?他想要找的类型,也就说你如果在系统里边配了一个叫application contest initial other,它就能给我们来找到,那我们来看他能不能找到。
09:17
走,如果找到了以后呢,会set会保存起来,保存为English initializer这个属性,诶它不仅找到了,还找到了七个,我们可不妨可以来找一下,它在哪能找到这么七个,我们来看一下spring factories里边,我们来挨个包里边看一下啊,Spring factories里边有没有人配置这个东西,我们这个包呢,有一个springbot包,我们先从一个一个包往下找spring boot包,Spring factories里边我们来看一下啊,它有没有什么叫我们这个东西叫什么呢?叫application contextest initialize,我来看啊,这正好有一个application contextest initialize,所以这12345这呢配了五个,然后呢,肯定有其他包里边又配了五个,又配了两个,所以呢他找到了七个,所以呢,我们现在确实看到了,他呢就会去spring factories这个文件里边去来找到我们指定的这些组件。
10:16
去我们这个文件里边找到我们指定的这些组件,那么这个东西呢,找到了七个,但是呢,我们把这个东西我们先不关心它,我们把它保留在这。我们给它加红,这是一个还有一个引导器。它呢想找我们这个初始化的引导器,还有我们这个初始化器,然后呢,我们来看啊,说化器呢,你只要找完以后呢,就保存到initializer里边,所以我们来看spring application这个类,因为当前正在创建这个类的对象,它的这个initialize里边,好,那就有七个这个东西,这七个东西呢,就是我们spring factor里边配的,不妨来看一下叫什么,呃,Configuration warning什么东西,我们来找configuration warning,还有还有我们的这个contest ID contest ID,还有我们这个delegating delegating,还有我们的这个r socket。
11:10
这一块等等等等,所以呢,这个初始化器他确实找到了,那么继续来看,相当于他在把读取,读取我们所有的这些原配置信息,找到这些初始化器以后,他在这又一个叫set listeners,他又找一些监听器叫application listener。找这个,这就是我们在这说的,我们在这研究启动原理的时候,我们来注意一些这些位置,这要找一个of理开listen呢,这个呢,我们翻译过来其实就是监听器应用的监听器应用监听器呢,一般就是来监听当前应用状态的,它呢也是一样,也是这个规则去spring factor里边找,但是呢,它找的是哪些。大家看船的类型叫application,不开listener,找的是这些,所以我们来看他能找到几个,走,我们来找listeners,它最终呢,找到以后就set listeners保存到这儿了,保存到这儿了。
12:11
这监听器呢,它找到了九个,我们来看一下这九个监听器。Listeners在这,而这几个监听器呢,从哪来?我怎么知道它能找到九个们还是挨个包分析看它的spring factor里边,其实我们就看到这一块有一个application listener,嗯,把这一块的listener就加进来了,好,所以呢,我们相当于项目一启动要有哪些监听器,初始化引导器,包括初始化器等等等等,你都可以配在这,那我们这个spring应用在一创建的时候,把这就会保存起来,保存起来以后呢,这还有一个第六次my application class相当于决定我们哪个呢是我们的主程序,这个主程序呢,我们现在它是通过找到对栈,找到我们这个对栈里边哪个是有慢方法的,那有慢方法的这个类,那就是我们的这个主程序,主程序类呢,你可能有很多,只要找到第一个类里边,它包含慢方法就行了,所以我们现在就OK了,这就是我们spring,呃,不开应用创建,做了那么一堆,简单来说,应用创建的过程就是把一些关键的组件给我们去。
13:19
读取信息读取来先提前保存到spring application里边,那保存到这呢,未来肯定有用好,那下一节课我们来分析整个应用这一块,Application创建完了以后,我们wrong的时候干了哪些活,好我们在这spring application在这就创建完了,接下来我在step into,那就进入wrong逻辑了,那下一节课来看。
我来说两句