spring boot 源码分析
说明:spring boot版本 2.0.6.RELEASE
思绪
首先,大家认识spring boot是从@SpringBootApplication注解和org.springframework.boot.SpringApplication.run(Class<?>, String...)开始的,那么我们就从这两个方向入手一探究竟。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。@SpringBootApplication注解
先来看下@SpringBootApplication的申明,如下图:
核心也就是@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解的组合。
@SpringBootConfiguration如下,即标明被@SpringBootApplication注解标注的类本身也是spring的java config类。
@ComponentScan,配置自动扫描功能,等同xml配置的<context:component-scan>。可以指定basePackages或者basePackageClasses标明扫描的根路径,如果不设置的话默认扫描@ComponentScan注解所在类的同级类和同级目录下的所有类,也就是@SpringBootApplication所在的类,所以一般spring boot项目的入口类会放在顶层目录中,这样就可以自动扫描到项目中所有的spring配置类。
@EnableAutoConfiguration,自动配置类,是简化spring配置的核心,spring一贯的风格凡是enable开头的注解都会配备一个@Import注解来引入一个ImportSelector。这里的@Import如下图所示:
扫盲:@Import注解作用是将values配置的class加入springIOC容器中:
如果是@Configuration的配置类,则将对应的java config产生的bean纳入spring管理;
如果是普通java类,则将该类实例化并纳入spring管理;
重点看下org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.selectImports(AnnotationMetadata)方法,返回一个string数组,内容为需要加载的类限定名。
核心是通过spring的FactoriesLoader机制加载以EnableAutoConfiguration注解全限定类名为key的class。
核心在org.springframework.core.io.support.SpringFactoriesLoader.loadSpringFactories(ClassLoader)方法中,如下图所示,其实就是在classpath下查找所有
META-INF/spring.factories文件中以EnableAutoConfiguration.getName为key的string列表。
下图就是其中一个示例:
spring.factories相关内容如下:
以直观的web容器自动配置为例:
其中的ServletWebServerFactoryAutoConfiguration和ReactiveWebServerFactoryAutoConfiguration即为根据ConditionalOnWebApplication应用类型来加载对应的webServerFactory,classpath下的自动配置webServer:
备注:ServletWebServer和ReactiveWebServer是两个路子,根据WebApplicationType走不通的路。
拿ReactiveWebServerFactoryAutoConfiguration来说,如下图所示,@Import了ConditionalOnWebApplication.Type.REACTIVE应用类型可能用到的WebServerFactory。
内部再根据对应条件创建对应的WebServerFactory。
最终org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.getWebServerFactory()以及
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory()从BeanFactory获取对应的WebServerFactory
串起来的话是在org.springframework.context.support.AbstractApplicationContext.refresh()中的onRefresh()的createWebServer创建server,finishRefresh()启动server。
好了,到这里spring boot的@SpringBootApplication注解就分析完了,跟上思路没,不要开小差哦~
SpringApplication.run分析
未完待续。。。
