一、简介
Spring Boot 的自动装配(Auto-configuration)是 Spring Boot 框架中一项强大的功能,它可以根据应用程序的依赖和配置自动完成大部分常见的配置工作,减少了开发者在项目中进行繁琐的手动配置的工作。
自动装配其实是通过条件化装配、自动配置类、配置属性绑定来实现的
- 条件化装配:Spring Boot 使用条件化注解(
@Conditional
)来实现自动装配。这些注解基于运行时环境的条件来决定是否需要装配某个组件。 - 自动配置类:Spring Boot 通过在 classpath 下的
META-INF/spring.factories
文件中定义自动配置类,这些自动配置类使用了条件化注解,根据条件来装配相应的组件。 - 配置属性绑定:自动配置类使用了配置属性(
@ConfigurationProperties
)来绑定应用程序的配置到相应的组件中。配置属性可以从application.properties
或application.yml
文件中读取。
所以如果我们想要引入一些第三方包,就需要按照下面几步来操作:
- 引入相关依赖:在项目的 Maven 配置文件中引入需要使用的 Spring Boot Starter 依赖。这些 Starter 依赖会自动带入相关的依赖和自动配置。
- 配置应用程序属性:在
application.properties
或application.yml
文件中配置应用程序的属性,这些属性会被自动装配所使用。 - 自定义配置:可以使用
@EnableAutoConfiguration
、@Import
和@Conditional
等注解来自定义配置。通过这些注解,可以排除或添加特定的自动配置类。
二、自动装配源码分析
我们从 SpringBoot 启动类上的 @SpringBootApplication
注解开始
@SpringBootApplication
是一个复合注解,包含多个注解的元注解,相当于同时添加了三个注解的效果:
- @SpringBootConfiguration:标记这是一个主配置类
- @EnableAutoConfiguration:启用Spring Boot的自动配置机制
- @ComponentScan:启用组件扫描,Spring Boot会自动扫描@SpringBootApplication注解所在类的所在包及其子包下的组件,并将其纳入Spring上下文中
可以知道 @EnableAutoConfiguration
就是用来开启自动配置,我们看下这个注解
这里用 @Import
注解导入了一个 AutoConfigurationImportSelector
类,这个 AutoConfigurationImportSelector
类实现了 DeferredImportSelector
接口,关于 @Import
注解,我们这里不展开,以后有机会单独讲,这边只需要知道,AutoConfigurationImportSelector
类实现了 DeferredImportSelector
接口,并且其内部类 AutoConfigurationGroup
实现了 DeferredImportSelector
.Group 接口,AutoConfigurationGroup
的 process
方法会在 SrpingBoot 启动时被调用,我们来看下这个方法
重点是这个 getAutoConfigurationEntry
方法,跟进去
然后跟进 getCandidateConfigurations
方法
继续跟进 loadFactoryNames
方法
继续跟进 loadSpringFactories
方法
这个 loadSpringFactories
方法里,可以看到,加载资源文件,然后运用了一套缓存机制,防止重复读取文件,浪费资源,可以看到读取的文件是 FACTORIES_RESOURCE_LOCATION
,我们看看这个是什么
正是 META-INF/spring.factories
,我们打开 EnableAutoConfiguration
所在的jar包中的这个路径,可以看到这个文件
文件中不只有 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
这个文件
SpringBoot启动的时候,会读取这个文件,将文件中的类加载到Spring容器中,我们看下 MybatisAutoConfiguration
这个配置类
- @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class }) 表示只有当
SqlSessionFactory
和SqlSessionFactoryBean
存在的时候,配置类才生效 - @ConditionalOnSingleCandidate(DataSource.class) 表示当容器中只存在一个类型为
DataSource
的 Bean 时,配置类才生效 - @EnableConfigurationProperties(MybatisProperties.class) 表示配置文件中的属性值与MybatisProperties类中定义的字段进行绑定
- @AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class }) 表示当前配置类在
DataSourceAutoConfiguration
和MybatisLanguageDriverAutoConfiguration
之后进行自动配置
然后配置类里通过 @Bean
注解导入Bean
其中的 @ConditionalOnMissingBean
意思就是当容器中没有这个类型的 Bean 时才生效
四、总结
自配装配的流程:
- SpringBoot 启动时,会扫描
META-INF/spring.factories
文件,获取所有自动配置类的全限定名 - Spring Boot 根据项目的依赖关系和配置信息,选择并加载相应的自动配置类
启动时,会扫描META-INF/spring.factories
文件,获取所有自动配置类的全限定名 - Spring Boot 根据项目的依赖关系和配置信息,选择并加载相应的自动配置类
- 自动配置类使用
@ConditionalOnXXX
注解来进行条件装配,通过判断特定条件是否满足来确定是否进行自动装配
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154472.html