Spring Boot 自动装配原理 / 1
ShawJie

Spring Boot 自动装配原理 / 1

Spring Bootspring-projects基于Spring Framework所构建的敏捷开发框架。应用Spring Boot我们可以快速构建独立的生产级应用。至于细说到为什么能快速的构建应用,就不得不提到Spring Boot的特性之一,自动装配和第三方Starter类库。

本篇所有代码及描述内容皆基于Spring Boot 2.2.5 RELEASE,其它版本Spring Boot可能会与本篇内容有部分出入

@SpringBootApplication

Spring Boot应用的一大特点是可以通过标准的main(String[] args)方法开始项目的启动,启动类会被标注@SpringBootApplication注解,而该注解可以说是Spring Boot应用的核心注解,一切的一切也都要从它说起。

我们先看一下@SpringBootApplication注解的内部结构:

1
2
3
4
5
6
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(...)
public @interface SpringBootApplication {
...
}

在此我省略掉了一些目前我们不太需要关注的内容,重点集中在@SpringBootConfiguration@ComponentScan@EnableAutoConfiguration这三个注解上。其中@SpringBootConfiguration注解的元注解只有@Configuration,即标注我们的应用启动类为应用配置类,其余无它。而@ComponentScan注解功能则类似于Spring FrameworkXML配置时代的<context:component-scan>标签,当未注明参数basePackage时,默认会以标注注解的类所在的包作为扫描起始路径。由于本篇本篇内容主要侧重点在自动装配原理,其它两个注解就如上一笔带过,主要的观测对象则是@EnableAutoConfiguration

@EnableAutoConfiguration

在应用实际开发过程中,项目通常会需要依赖到很多第三方类库,譬如ORM框架MybatisHibernate,模板框架ThymeleafFreemarker,微服务相关Spring Cloud EurekaSpring cloud gateway等等。而在Spring Boot应用中我们通常只需要在POM文件中引入相关类库的Starter,几乎可以做到开箱即用。而开箱即用的背后,则是Spring Boot的自动装配特性所做的努力。

我们先看一看@EnableAutoConfiguration的注解结构

1
2
3
4
5
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}

​ 目前我们还是只知道添加该注解可以激活Spring Boot应用的自动装配功能,但是具体的自动装配过程并不知悉。没关系,目前来说我们只需要记住@Import(AutoConfigurationImportSelector.class)这一行元注解,至于其具体的做用我们之后慢慢说。

​ 谈及自动装配功能的实现,我们得先从Spring Boot的应用启动过程说起。

  • 关于Spring Boot应用启动我把它大致分为以下几个阶段:
    • Spring应用初始化阶段,在当前阶段Spring应用会完成:
      • 应用类型推断
      • 从类路径中加载所有META-INF/spring.factories文件数据并缓存(重点)
      • 从缓存中获取要加载的初始化器即监听器
      • 应用主类(启动类)推断
    • Spring应用启动准备阶段,在当前阶段Spring应用会完成:
      • 从缓存中获取、加载应用监听器,并触发启动事件
      • 封装应用启动参数和系统环境变量
      • 从缓存中获取、加载Spring Boot应用异常报告器
      • 根据初始化阶段推断的应用类型进行应用上下文的创建初始化操作
      • 刷新(启动)Spring应用上下文,开始了Spring应用准备工作的主要部分
    • Spring应用启动阶段,在当前阶段Spring应用会完成:
      • 对Spring应用进行一些预处理操作(修改应用状态标记、启动计时等)
      • BeanFactory进行一系列内建Bean的注册操作
      • 执行应用上下文对BeanFactory的后处理操作
      • 执行BeanFactory的后处理操作以进行Spring Bean的解析、注册(重点)
      • 之后则是注册Bean处理器、初始化消息源、初始化事件广播器、执行应用上下文额外启动逻辑、注册监听器、完成Bean Factory初始化逻辑并调用Spring Bean的后置处理逻辑,完成应用的启动阶段,并将Bean交由Lifecycle Processer进行生命周期管理
      • 最后调用CommandLineRunnerApplicationRunner实现类的自定义逻辑,完成应用启动流程,进入应用运行阶段

小结

​ 在本篇中我们主要了解了一下@SpringBootApplication的三个元注解,以及Spring Boot应用的粗粒度启动过程,大家也注意到了启动过程中我用粗体标注了两个重点,而下一篇内容,我们则会围绕这两个重点,对自动装配过程进行详细论述。