作为spring源码分析的最后一篇,我们会分析springboot的源码,springboot比起spring+springmvc主要多了两点功能,一个是自动配置,一个是整合了嵌入式的sevlet容器。
自动配置
自动配置主要是由@SpringBootApplication注解实现的,这个注解除了实现了自动配置以外,还有自动包扫描,我们分别来讲这两部分
SpringBootApplication也是一个组合注解,主要功能在@EnableAutoConfiguration里面
@Import(AutoConfigurationImportSelector.class)实现了自动配置,@AutoConfigurationPackage实现了自动包扫描
@Import(AutoConfigurationImportSelector.class)
这是一个DeferredImportSelector,所以我们直接看他的getImportGroup
进入AutoConfigurationGroup的process方法
这个方法完成了autoConfig的扫描
loadFactoryNames
loadSpringFactories
可以看到这里去META-INF/spring.factories里面读取类名,然后加载到容器中,所以只要我们配置到META-INF/spring.factories中的类都会被自动加入到容器中,这就是自动配置的原理
@AutoConfigurationPackage
又是一个组合注解
AutoConfigurationPackages.Registrar类
可以看出,这里往容器中注入了一个BasePackagesBeanDefinition,该类实现了GenericBeanDefinition
获取到所有的包名
CachingMetadataReaderFactoryPostProcessor会处理这些包名,包包里的类注入到容器
自动启动原理
跟踪一下run方法的执行
进入refreshContext,跟踪到最后就是刷新了容器
spring容器的类型为AnnotationConfigServletWebServerApplicationContext
这里重写了onRefresh
这个方法完成了sevlet容器的创建