SpringBoot自动装配

概述

使用 Spring 进行开发各种配置过于麻烦比如开启某些 Spring 特性时,需要用 XML 或 Java 进行显式配置。于是,Spring Boot 诞生了!Spring 旨在简化 J2EE 企业应用程序开发。Spring Boot 旨在简化 Spring 开发(减少配置文件,开箱即用!

Spring Boot只是简化了配置,如果你需要构建MVC架构的Web程序,你还是需要使用Spring MVC作为MVC框架,只是说SpringBoot帮你简化了Spring MVC的很多配置,真正做到开箱即用!

自动装配原理

SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能。

核心注解:

  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制(实现自动装配的重要注解,主要是Import了AutoConfigurationImportSelector这个自动装配类)
  • @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
  • @ComponentScan:扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。如下图所示,容器中将排除TypeExcludeFilterAutoConfigurationExcludeFilter

AutoConfigurationImportSelector

AutoConfigurationImportSelector 类实现了 ImportSelector接口,也就实现了这个接口中的 selectImports方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中

该方法调用链如下:

image-20240221121224146
  1. 判断自动装配开关是否打开
  2. 用于获取EnableAutoConfiguration注解中的 excludeexcludeName(用于手动导入的配置类)。
  3. 读取META-INF/spring.factories获取需要自动装配的所有配置类
  4. 对配置类进行筛选,@ConditionalOnXXX 中的所有条件都满足,该类才会生效。
  5. 执行配置类,加载相应bean对象

启动流程

  1. run方法进入,传入启动类class的原因(标记启动类,方便后续解析启动类注解)

  2. 创建SpringApplication

    1. 保存启动类class
    2. 判断WebApplication类型
    3. 读取spring.factories文件设置初始化器
    4. 读取spring.factories文件设置监听器

    这里会将spring.factories文件的配置设置到map缓存中。

  3. 并且调用SpringApplication的run方法

    1. 创建上下文对象,开启监听器
    2. 封装Environment环境对象
    3. 准备上下文对象,创建Spring容器将系统启动类放进去
    4. 进入refresh方法,会根据配置类包括启动类,解析相应注解,其中@Import引入了AutoConfigurationImportSelector进行上述的自动装配流程

实现一个Starter

  1. 创建XXX-spring-boot-starter工程

  2. 引入 Spring Boot 相关依赖

  3. 创建XXXAutoConfiguration配置类

  4. XXX-spring-boot-starter工程的 resources 包下创建META-INF/spring.factories文件

    1
    2
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.example.XXXAutoConfiguration
  5. 在其他工程中引用使用