开源实践
initializr
io.spring.initializr:initializr-web:0.9.2
自动装配
- spring.factories 中 org.springframework.boot.autoconfigure.EnableAutoConfiguration=io.spring.initializr.web.autoconfigure.InitializrAutoConfiguration
- InitializrAutoConfiguration 中带有注解 @Configuration 等
@Import 与 ImportSelector 结合
1 | (AnnotationConfigApplicationContext)context.register(CoreConfiguration.class); |
基础知识
目标
快速将 spring 和第三方框架整合,构建可独立运行的生产级 spring 程序;
核心概念
- 约定优于配置(提供默认的配置);
- 自动装配(将第三框架的 bean 注入 ioc 容器);
启动器starter
实现 springboot 目标的工程实践;
命名规范:官方命名模式 spring-boot-starter-name;第三方命名模式 thirdparty-spring-boot-starter;
实现原理 by javaboy
SpringBoot 项目的启动类都有一个 @EnableAutoConfiguration 注解,表示启用 Spring 上下文的自动装配,该注解会自动导入一个名为 AutoConfigurationImportSelector 的类,
而这个类会去读取jar中的 META-INF/spring.factories 文件,spring.factories 中则定义需要加载的配置类,我们打开任意一个框架的 Starter ,都能看到它有一个 spring.factories 文件。
sb的 jar包结构
1 | xxxx-0.0.1-SNAPSHOT.jar |
在下面可以跟踪下loader包下的源码 spring-boot-maven-plugin
配置参数
application-properties 参数列表
当jar包中存在由 @PropertySource,@ConfigurationProperties 注解的类时,表明该类属性遵循 配置参数覆盖原则,可在应用中个性化配置。
博客总结
fangjian_SpringBoot源码分析系列
待验证
EnableAutoConfiguration是 自动装配 的开关?执行时机或具体位置?EnableAutoConfigurationImportSelector 执行逻辑?
EnableAutoConfiguration 注解
@EnableAutoConfiguration 注解的理念、工作原理和其他 @Enable 注解一脉相承。简单的来说,就是该注解借助 @Import 注解的支持,
Spring 的 IoC 容器收集和注册特定场景相关的 Bean 定义;@EnableScheduling是通过@Import将Spring调度框架相关的bean都加载到IoC容器。
@EnableAutoConfiguration 的源码:@Import(EnableAutoConfigurationImportSelector.class),
它借助 EnableAutoConfigurationImportSelector.class 将所有符合条件的 @Configuration 配置类都加载到当前 IoC 容器,就像一个“八爪鱼”一样。
EnableAutoConfigurationImportSelector.java 的父类 AutoConfigurationImportSelector.java 到 SpringFactoriesLoader
SpringFactoriesLoader 属于Spring框架专属的一种扩展方案(其功能和使用方式类似于Java的SPI方案:java.util.ServiceLoader),
它的主要功能就是从指定的配置文件META-INF/spring.factories中加载配置。
重要方法 load(context, sources.toArray(new Object[sources.size()]));
将之前通过@EnableAutoConfiguration 获取的所有配置类加载到已经准备完毕的 ApplicationContext 中。
各类扩展点
- SpringApplicationRunListener 监听者
- SpringApplicationRunListener 默认的实现 EventPublishingRunListener,用来在 SpringBoot 的整个启动流程中的不同时间点发布不同类型的应用事件(SpringApplicationEvent)。
那些对这些应用事件感兴趣的 ApplicationListener 可以接受并处理(这也解释了为什么在 SpringApplication 实例化的时候加载了一批 ApplicationListener,但在run方法执行的过程中并没有被使用)。
- SpringApplicationRunListener 默认的实现 EventPublishingRunListener,用来在 SpringBoot 的整个启动流程中的不同时间点发布不同类型的应用事件(SpringApplicationEvent)。
- ApplicationListener:Spring框架对Java中实现的监听者模式的一种框架实现
- ApplicationContextInitializer:ApplicationContext做refresh之前,允许我们对ConfiurableApplicationContext的实例做进一步的设置和处理
- CommandLineRunner:SpringBoot应用的回调扩展接口;执行时间点是在SpringBoot应用的Application完全初始化工作之后