SpringBoot自动装配原理

文章目录

  • 一、简介
  • 二、自动装配源码分析
  • 三、自动装配以mybatis举例
  • 四、总结

一、简介

Spring Boot 的自动装配(Auto-configuration)是 Spring Boot 框架中一项强大的功能,它可以根据应用程序的依赖和配置自动完成大部分常见的配置工作,减少了开发者在项目中进行繁琐的手动配置的工作。

自动装配其实是通过条件化装配、自动配置类、配置属性绑定来实现的

  • 条件化装配:Spring Boot 使用条件化注解(@Conditional)来实现自动装配。这些注解基于运行时环境的条件来决定是否需要装配某个组件。
  • 自动配置类:Spring Boot 通过在 classpath 下的 META-INF/spring.factories 文件中定义自动配置类,这些自动配置类使用了条件化注解,根据条件来装配相应的组件。
  • 配置属性绑定:自动配置类使用了配置属性(@ConfigurationProperties)来绑定应用程序的配置到相应的组件中。配置属性可以从 application.propertiesapplication.yml 文件中读取。

所以如果我们想要引入一些第三方包,就需要按照下面几步来操作:

  1. 引入相关依赖:在项目的 Maven 配置文件中引入需要使用的 Spring Boot Starter 依赖。这些 Starter 依赖会自动带入相关的依赖和自动配置。
  2. 配置应用程序属性:在 application.propertiesapplication.yml 文件中配置应用程序的属性,这些属性会被自动装配所使用。
  3. 自定义配置:可以使用 @EnableAutoConfiguration@Import@Conditional 等注解来自定义配置。通过这些注解,可以排除或添加特定的自动配置类。

二、自动装配源码分析

我们从 SpringBoot 启动类上的 @SpringBootApplication 注解开始

SpringBoot自动装配原理_第1张图片

@SpringBootApplication 是一个复合注解,包含多个注解的元注解,相当于同时添加了三个注解的效果:

  • @SpringBootConfiguration:标记这是一个主配置类
  • @EnableAutoConfiguration:启用Spring Boot的自动配置机制
  • @ComponentScan:启用组件扫描,Spring Boot会自动扫描@SpringBootApplication注解所在类的所在包及其子包下的组件,并将其纳入Spring上下文中

可以知道 @EnableAutoConfiguration 就是用来开启自动配置,我们看下这个注解

SpringBoot自动装配原理_第2张图片

这里用 @Import 注解导入了一个 AutoConfigurationImportSelector 类,这个 AutoConfigurationImportSelector 类实现了 DeferredImportSelector 接口,关于 @Import 注解,我们这里不展开,以后有机会单独讲,这边只需要知道,AutoConfigurationImportSelector 类实现了 DeferredImportSelector 接口,并且其内部类 AutoConfigurationGroup 实现了 DeferredImportSelector.Group 接口,AutoConfigurationGroupprocess 方法会在 SrpingBoot 启动时被调用,我们来看下这个方法

SpringBoot自动装配原理_第3张图片

重点是这个 getAutoConfigurationEntry 方法,跟进去

SpringBoot自动装配原理_第4张图片

然后跟进 getCandidateConfigurations 方法

SpringBoot自动装配原理_第5张图片

继续跟进 loadFactoryNames 方法

image-20230626171038825

继续跟进 loadSpringFactories 方法

SpringBoot自动装配原理_第6张图片

这个 loadSpringFactories 方法里,可以看到,加载资源文件,然后运用了一套缓存机制,防止重复读取文件,浪费资源,可以看到读取的文件是 FACTORIES_RESOURCE_LOCATION,我们看看这个是什么

SpringBoot自动装配原理_第7张图片

正是 META-INF/spring.factories,我们打开 EnableAutoConfiguration 所在的jar包中的这个路径,可以看到这个文件

SpringBoot自动装配原理_第8张图片

文件中不只有 EnableAutoConfiguration 还有别的一些类的全路径,这其实是叫SPI的一种机制,有兴趣的可以去看看

三、自动装配以mybatis举例

下面我们以 mybatis 来举例,当我们需要使用 mybatis 时,我们在 pom 文件中引入 mybatis 的 starter

<dependency>
    <groupId>org.mybatis.spring.bootgroupId>
    <artifactId>mybatis-spring-boot-starterartifactId>
    <version>2.1.4version>
dependency>

这个 starter 中 包含了 引入 mybatis-spring-boot-autoconfigure 这个包,而 mybatis 的自动配置类 MybatisAutoConfiguration 就在这个包中,我们在这个包的 META-INF 目录下可以找到 spring.factories 这个文件

SpringBoot自动装配原理_第9张图片

SpringBoot启动的时候,会读取这个文件,将文件中的类加载到Spring容器中,我们看下 MybatisAutoConfiguration 这个配置类

SpringBoot自动装配原理_第10张图片

  • @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class }) 表示只有当 SqlSessionFactorySqlSessionFactoryBean 存在的时候,配置类才生效
  • @ConditionalOnSingleCandidate(DataSource.class) 表示当容器中只存在一个类型为 DataSource 的 Bean 时,配置类才生效
  • @EnableConfigurationProperties(MybatisProperties.class) 表示配置文件中的属性值与MybatisProperties类中定义的字段进行绑定
  • @AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class }) 表示当前配置类在 DataSourceAutoConfigurationMybatisLanguageDriverAutoConfiguration 之后进行自动配置

然后配置类里通过 @Bean 注解导入Bean

SpringBoot自动装配原理_第11张图片

其中的 @ConditionalOnMissingBean 意思就是当容器中没有这个类型的 Bean 时才生效

四、总结

自配装配的流程:

  1. SpringBoot 启动时,会扫描 META-INF/spring.factories 文件,获取所有自动配置类的全限定名
  2. Spring Boot 根据项目的依赖关系和配置信息,选择并加载相应的自动配置类
    启动时,会扫描 META-INF/spring.factories 文件,获取所有自动配置类的全限定名
  3. Spring Boot 根据项目的依赖关系和配置信息,选择并加载相应的自动配置类
  4. 自动配置类使用 @ConditionalOnXXX 注解来进行条件装配,通过判断特定条件是否满足来确定是否进行自动装配

你可能感兴趣的:(Spring,Java,源码学习,spring,boot,java,spring)