SpringBoot自动配置-源码解析过程
2022-03-09 18:40:02 0 举报
SpringBoot自动配置源码解析过程
作者其他创作
大纲/内容
就是完成context上下文 属性的设置。包含核心启动类 Bean 对象的创建。(将核心启动类的的 beanDefinition 存储到 DefaultListableBeanFactory的 beanDefinitionMap中)
创建 Undertow
span style=\"font-size: inherit;\
this.mainApplicationClass = deduceMainApplicationClass();
AutoConfigurationImportSelector
// 再进一步排除 `exclude` 的自动配置类AutoConfigurationGroup#selectImports
org.springframework.boot.SpringApplication#getOrCreateEnvironment
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class))
SpringApplication
SpringApplication.run
createWebServer()
AutoConfigurationPackages.Registrar 这个类就干一个事,注册一个 Bean ,这个 Bean 就是 org.springframework.boot.autoconfigure.AutoConfigurationPackages.BasePackages,它有一个参数,这个参数是使用了 @AutoConfigurationPackage 这个注解的类所在包路径(启动类所在包路径),保存自动配置类以供之后的使用
org.springframework.boot.SpringApplication#configureEnvironment
启动 Tomcat
@Import(AutoConfigurationImportSelector.class)
//获取符合条件自动配置类,避免加载不必要的自动配置类从而造成内存浪费getAutoConfigurationEntry
@EnableAutoConfiguration
@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)
run 方法
【1.2】 初始化 classpath 下 META-INFO/spring.factories 中已配置的 ApplicationContextInitializer
// 3. 初始化应用上下文context = createApplicationContext();
@SpringBootApplication
@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
【1.1】 推断应用类型,后面会根据类型初始化对应的环境。常用的一般都是 servlet 环境
创建 Jetty
返回类型是 WebApplicationType 的枚举类型,WebApplicationType 有三个枚举
GenericApplicationContext 的 构造方法 从 构建了 IoC 容器(DefaultListableBeanFactory)
@AutoConfigurationPackage
// 3.启动响用的监听器,其中一个重要的监听器 ConfigFileApplicationListener 就是加载项目配置文件的监听器listeners.environmentPrepared(environment);
@SpringBootConfiguration
org.springframework.boot.SpringApplication#prepareEnvironment
ConfigurationClassParser
//自动配置实现逻辑的入口方法DeferredImportSelectorGrouping#getImports
应用上下文可以理解成 IoC 容器的高级表现形式
@Configuration
getAutoConfigurationEntry 方法总结:1.从 `spring.factories` 配置文件中加载 `EnableAutoConfiguration` 自动配置类。2.若 `@EnableAutoConfiguration` 等注解标有要 `exclude` 的自动配置类,那么排除掉。3.调用 `filter`方法进一步的过滤,再次排除一些不符合条件的自动配置类。4.触发 `AutoConfigurationImportEvent` 事件,告诉 `ConditionEvaluationReport` 条件评估报告器来记录符合条件的自动配置类。5.最后再将符合条件的自动配置类返回。
refreshContext 刷新应用上下文
【1.4】 根据调用栈,推断出 main 方法的类名
调用onRefresh()
【1.3】 初始化 classpath 下 META-INF/spring.factories 中所有已配置的 ApplicationListener
// 5. 刷新应用上下文refreshContext(context);
SpringBoot项目启动
SpringFactoriesLoader.loadFactoryNames
SpringApplication#run(java.lang.String...)
loader.load();
// 这里会调用 AutoConfigurationImportFilter 的 match 方法来判断是否符合 @ConditionalOnBean,@ConditionalOnClass 或 @ConditionalOnWebApplicationfilter
实现类ServletWebServerApplicationContext覆写了onRefresh 方法
registerListeners();
SpringApplication() 构造方法
IoC 容器的初始化过程的三个步骤(主类所在包的类):1. Resource 定位2. BeanDefinition的载入3. 注册BeanDefinition
// 1. 获取并启动监听器SpringApplicationRunListeners listeners = getRunListeners(args);
//得到 spring.factories 文件配置的所有自动配置类getCandidateConfigurations
SpringBoot 启动类的 SpringApplication.run方法解析
......
@Import(AutoConfigurationPackages.Registrar.class)
SpringApplication类的构造方法,主要是在 Spring 容器创建之前做一些预备工作,和定制化的需求
创建 Tomcat
org.springframework.boot.SpringApplication#getBeanDefinitionRegistry
org.springframework.boot.SpringApplication#getRunListeners
// 自动配置逻辑相关的入口方法AutoConfigurationGroup#process
SpringFactoriesLoader
// 让 SpringFactoriesLoader去加载一些组件的名字,该方法的第一个参数是对组件过滤的key(EnableAutoConfiguration)// 遍历整个ClassLoader中所有所有 jar 包下的 spring.factories 文件loadFactoryNames
restartClassLoader
SpringBoot 自动配置源码解析图
主要是从定义的扫描路径中,找出标识了需要装配的类,自动装配到spring 的 bean容器中
@ComponentScan
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class))
// 1.创建并配置相应的环境ConfigurableEnvironment environment = getOrCreateEnvironment();
WebApplicationType#deduceFromClasspath
org.springframework.boot.SpringApplication#load
finishRefresh();
接口 ServletWebServerFactory 的 getWebServer(ServletContextInitializer... initializers) 方法的几种实现
base-classloader
org.springframework.boot.autoconfigure.AutoConfigurationPackages#register
// 两件事:1.初始化 SpringApplication 2.执行 run 方法SpringApplication(primarySources).run(args)
SpringBoot 内嵌 tomcat 自动配置原理
@Import注解的解析:在核心启动类的注解上进行递归解析 @Import 注解,会解析出两个 ,其中参数为 AutoCongurationImportSelector.class,然后就会执行 自动配置逻辑的入口方法,DeferredImportSelectorGrouping#getImports,然后 执行AutoConfigurationImportSelector子类AutoConfigurationGroup的process
@SpringBootConfiguration 注解的作用与 @Configuration 注解相同,都是标识一个可以被组件扫描器扫描的配置类,只不过 @SpringBootConfiguration 是被 SpringBoot进行了重新封装命名而已。
1.Resource定位 包括主类所在包的定位(扫描被@ComponentScan下 @Component注解标注的类)、@Import注解标注的类、和 SPI 扩展机制实现自动装配
0 条评论
下一页