use springboot

开源实践

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
2
3
4
5
6
7
(AnnotationConfigApplicationContext)context.register(CoreConfiguration.class);
@Configuration
@Import(ProjectGenerationImportSelector.class)
static class CoreConfiguration {}
ProjectGenerationImportSelector 到 ProjectGenerationConfiguration.class
spring.factories 中
@ProjectGenerationConfiguration 注解的还是 Configuration 配置类,引入bean

基础知识

目标

快速将 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
2
3
4
5
6
7
8
xxxx-0.0.1-SNAPSHOT.jar
-- BOOT-INF 类似与 web-inf
---- classes/.. 源码打包
---- lib/.. 所有依赖 jar 包
-- META-INF
---- maven/..
---- MANIFEST.MF java -jar 会用到目录META-INF\MANIFEST.MF文件的 Main-Class属性
-- org/springframework/boot/loader/.... Main-Class 所指定的路径

在下面可以跟踪下loader包下的源码 spring-boot-maven-plugin

配置参数

application-properties 参数列表
当jar包中存在由 @PropertySource,@ConfigurationProperties 注解的类时,表明该类属性遵循 配置参数覆盖原则,可在应用中个性化配置。

博客总结

fangjian_SpringBoot源码分析系列
待验证
EnableAutoConfiguration是 自动装配 的开关?执行时机或具体位置?EnableAutoConfigurationImportSelector 执行逻辑?


hafiz_springboot

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 中。

各类扩展点

  1. SpringApplicationRunListener 监听者
    • SpringApplicationRunListener 默认的实现 EventPublishingRunListener,用来在 SpringBoot 的整个启动流程中的不同时间点发布不同类型的应用事件(SpringApplicationEvent)。
      那些对这些应用事件感兴趣的 ApplicationListener 可以接受并处理(这也解释了为什么在 SpringApplication 实例化的时候加载了一批 ApplicationListener,但在run方法执行的过程中并没有被使用)。
  2. ApplicationListener:Spring框架对Java中实现的监听者模式的一种框架实现
  3. ApplicationContextInitializer:ApplicationContext做refresh之前,允许我们对ConfiurableApplicationContext的实例做进一步的设置和处理
  4. CommandLineRunner:SpringBoot应用的回调扩展接口;执行时间点是在SpringBoot应用的Application完全初始化工作之后