Springboot自动装配及启动流程

1.从SpringApplication.run()开始执行,首先会构造new SpringApplication(primarySources)实例,进行初始化设置

1.1 根据传入的启动主类名赋值primarySources,判断web应用类型webApplicationType

1.2 通过getSpringFactoriesInstances(ApplicationContextInitializer.class)方法从META-INF/spring.factories文件中获取对应的Initializer类及Listener类名,通过反射创建实例存到list中,赋值给SpringApplication的initializers属性

1.3 通过getSpringFactoriesInstances(ApplicationListener.class)方法从META-INF/spring.factories文件加载对应的类名(各种程序监听器(ApplicationListener)), 进行反射,放到SpringApplication的listeners集合中

1.4 通过反射获得执行的主类Class

2.执行SpringApplication对象的run方法,进行环境的准备工作及上下文刷新

2.1环境准备

2.1.1 通过getRunListeners方法从META-INF/spring.factories文件中获取SpringApplicationRunListener对应的RunListener名,通过反射实例化,构造SpringApplicationRunListeners

2.1.2 通过prepareContext方法进行环境准备,在该方法中通过load方法开始加载主类(sources就是1.4中生成的主类),跟着load方法走,发现最后会向annotatedReader注册主类(也就是可以被Bean加载器扫描到了),至此准备工作结束

PS:这个annotatedReader是BeanDefinitionLoader类型,这个类型其实就是用来加载通过注解方式的类,还有一种类型是XmlBeanDefinitionReader,用来加载xml方式的类

2.2 上下文刷新

2.2.1 进入refreshContext方法,根据refresh方法一直追下去会追溯到AbstractApplicationContext类的refresh()方法,自动装载过程就是从这里开始的,从里面的invokeBeanFactoryPostProcessors方法开始看,该方法的作用就是执行已注册为bean的factory processors

2.2.2 跟随invokeBeanFactoryPostProcessors方法追进去查找,发现其会按照Processor的优先级顺序依次执行所有的Processor,通过PostProcessor的postProcessBeanDefinitionRegistry方法追到一个接口BeanDefinitionRegistryPostProcessor

2.2.3 找到其实现类ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法,继续往下追,会看到解析@Configuration代码部分,进入parse方法,并继续往下追到doProcessConfigurationClass方法,在此方法中就会看到对各类注解的处理过程

2.2.4 在doProcessConfigurationClass方法中会先后对@PropertySource、@ComponentScan、@Import、@ImportResource等注解注释指明的类扫描处理

2.2.5 其中@Import处理部分,首先通过getImports方法扫描到AutoConfigurationImportSelector和Registrar类,然后通过在processImports方法将2个类实例化并存放到ConfigurationClass的内部map中

2.2.6 扫描到自动装配的类之后,往上跳返回到parse方法中,注意到this.deferredImportSelectorHandler.process()方法,该方法就是对扫描到的import类进行处理,进入process方法,追下去,发现processGroupImports方法进入其中,追到getImports方法中,看到这一行this.group.process方法,debug发现group是DeferredImportSelector.Group类的具体实现类AutoConfigurationImportSelector

2.2.7 在AutoConfigurationImportSelector类中定位到process方法,找到getAutoConfigurationEntry方法,追进去,发现其首先通过getCandidateConfigurations方法从META-INF/spring.factories文件中设定的自动加载所有相关类(key=EnableAutoConfiguration),然后会过滤筛选出项目需要的自动配置类

2.2.8 转回到refresh()中,registerBeanPostProcessors方法将processors绑定到beanFactory上;onRefresh方法会执行AbstractApplicationContext抽象类的实现类ServletWebServerApplicationContext的onRefresh方法中完成tomcat的初始化工作

2.2.9 finishBeanFactoryInitialization方法完成所有bean factory的初始化工作