1.SpringBoot的自动装配原理
主要文件:spring.factories
关键类:BeanPostProcessor(AOP在这个类实现) 和BeanFactoryPostProcessor(自动装配在这实现)
实现的方法名称(准备上下文):prepareContext(监听配置、设置环境对象、进行初始化操作、load对应的资源)
prepareContext方法之前的操作豆角准备工作(事件发布)
是在BeanFactoryPostProcessor里面处理的,是要判断一系列的注解或者标签,最终我们解析到import的时候,可以取到AutoConfigurationImportSelector
EnableAutoConfiguration类去加载spring.factory文件
2.SpringBoot启动流程
1.new SpringApplication():去spring.factory里面查找我们的初始化器,再去里面查找我们的监听器,还有些其他操作,选择我们应用的sevlet的类型。
2.调用run方法:使是我们Spring的核心流程,prepareContext之前的操作都是在为spring做准备工作
3.调用prepareContext方法:准备上下文(监听配置、设置环境对象、进行初始化操作、load对应的资源)在整个自动装配中,做了加载启动类,把启动类注入容器中。
4.refreshContext:->refresh方法:是启动的核心步骤。(1.创建工厂,2拿取配置信息,3.执行BeanFactoryPostProcessor处理类(方法名称是invokeBeanFactoryPostProcessors()),4.注册BeanPostPeocessor(方法名称是registerBeanPostProcessor())5,初始化消息配置(国际化配置),6.初始化事件广播器,7.注册监听器(方法名称registerListenrs(),8.开始进行所有单例对象实例化的环节(方法名称:finshBeanfactoryInitialization()),9.完成刷新(finshRefresh))
启动流程:
首先分为四大模块:
-
服务构建
New SpringApplication()构造方法里面
把传入的资源加载器和主方法类加载到内存中。
设置确认web应用的服务类型、设置初始化器(七个)、设置事件监听器(8个)、加载启动类 -
环境准备
调用run方法进入环境准备阶段- 创建bootstrapContext(启动上下文)
- 启动运行监听器(SpringApplicationRunnerListeners),同时发布启动事件,相当于开启我们之前加载的8个Listener,然后就可以接受相对应的事件了。
- 组装环境参数(通过prepareEnvironment方法)。所谓的环境参数就是系统环境变量和JVM系统属性。然后发布环境准备完成事件,对应的8个Listener会监听到这个事件(通过观察者模式,逐一串行),会等待所有的监听器都处理完成后再继续执行,最后打印banner图。
-
容器创建
- 就是传说中的ApplicationContext的创建。通过createApplicationContext来创建容器(里面包含了创建BeanFactory和创建后处理器“是用来解析注解的处理器”,创建好后就放到容器)。
- 部分属性初始化(调用prepareContext方法),里面包括了设置资源加载器、执行七个初始化器、发布容器准备完成事件、调用load方法,把启动类的资源bean加载到定义池中。最后发布资源加载完成事件。到此容器就创建完成了。
-
属性填充
- 创建bean,放到容器当中(调用方法refreshContext,里面包含了12个小步骤,包括自动装备,启动tomcat服务器,和bean的生命周期)
- 发布启动完成事件,同时回调自定义实现的Runner接口。
自动装配:AutoConfigurationImportSelecter类
refresh方法:是启动的核心步骤。(1.重新构造beanFactory工厂,2拿取和检验配置信息,3.执行BeanFactoryPostProcessor处理类(方法名称是invokeBeanFactoryPostProcessors()),4.注册BeanPostPeocessor(方法名称是registerBeanPostProcessor())5,初始化消息配置(国际化配置),6.初始化事件广播器,7.注册监听器(方法名称registerListenrs(),8.开始进行所有单例对象实例化的环节(方法名称:finshBeanfactoryInitialization()),9.完成刷新(finshRefresh))