SpringBoot自动装配原理

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路SpringBoot自动装配原理,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、简介

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 注解开始

image-20230626170748482

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

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

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

image-20230626170936576

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

image-20230626171006691

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

image-20230626171020064

然后跟进 getCandidateConfigurations 方法

image-20230626171030204

继续跟进 loadFactoryNames 方法

image-20230626171038825

继续跟进 loadSpringFactories 方法

image-20230626171048309

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

image-20230626171101832

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

image-20230626171114150

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

三、自动装配以mybatis举例

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

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

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

image-20230626171127738

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

image-20230626171140819

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

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

image-20230626171152261

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

四、总结

自配装配的流程:

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154472.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!