在 Spring Boot 项目中,自动配置是一个非常强大的功能,可以极大简化配置工作。本文将通过 MyBatis 的自动配置为例,详细解析 Spring Boot 自动配置的整个流程,包括从 META-INF/spring.factories
文件到 mysql-connector-java
依赖的引入,帮助大家更好地理解 Spring Boot 的自动配置机制。
1. @SpringBootApplication
注解概述
@SpringBootApplication
是一个组合注解,包含了以下三个关键注解:
@SpringBootConfiguration
:标记当前类为配置类,相当于@Configuration
。@EnableAutoConfiguration
:启用自动配置机制。@ComponentScan
:自动扫描并加载指定包及其子包中的组件。
这些注解共同作用,启动并配置 Spring Boot 应用。
2. @EnableAutoConfiguration
与 META-INF/spring.factories
@EnableAutoConfiguration
是 Spring Boot 自动配置的核心注解。它通过 @Import(AutoConfigurationImportSelector.class)
将自动配置类导入到 Spring 容器中。这个过程涉及到 META-INF/spring.factories
文件。
在 Spring Boot 的 spring-boot-autoconfigure
包中,META-INF/spring.factories
文件中列出了所有可以自动配置的类。例如,MyBatis 的自动配置类在 mybatis-spring-boot-autoconfigure
包中声明如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
3. MyBatis 自动配置类的工作原理
MyBatis 的自动配置类 MybatisAutoConfiguration
会根据项目中的依赖和配置,自动将 MyBatis 的核心组件(如 SqlSessionFactory
、SqlSessionTemplate
等)注入到 Spring 容器中:
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class})
public class MybatisAutoConfiguration {
private final MybatisProperties properties;
private final DataSource dataSource;
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(this.dataSource);
return factory.getObject();
}
@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4. 引入 MySQL 连接驱动
在使用 MyBatis 时,我们通常需要连接到数据库。以 MySQL 为例,通常需要在 pom.xml
中引入 mysql-connector-java
依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
mysql-connector-java
提供了与 MySQL 数据库通信的能力,Spring Boot 在启动时会检测到该驱动并配置数据源。
5. 数据源自动配置
Spring Boot 自带的 DataSourceAutoConfiguration
会根据项目中引入的数据库驱动,自动配置 DataSource
并注入到 Spring 容器中。MyBatis 的自动配置类会依赖于此 DataSource
。
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(name = "spring.datasource.type")
@Import({DataSourceConfiguration.Hikari.class})
public class DataSourceAutoConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
}
6. 整体流程总结
- Spring Boot 启动:
@SpringBootApplication
注解启动了整个 Spring Boot 应用,触发@EnableAutoConfiguration
机制。 - 读取配置类:
AutoConfigurationImportSelector
从META-INF/spring.factories
文件中读取 MyBatis 的自动配置类,并将其注入 Spring 容器。 - 自动配置 MyBatis:
MybatisAutoConfiguration
根据项目中的配置和依赖,自动配置 MyBatis 的核心组件。 - 配置数据源:通过引入
mysql-connector-java
依赖,Spring Boot 自动配置数据源并与 MyBatis 进行整合。
通过以上流程,Spring Boot 实现了 MyBatis 和 MySQL 数据源的自动配置,大大简化了开发者的配置工作。理解这个流程,不仅有助于更好地使用 MyBatis,也能帮助你深入理解 Spring Boot 的自动配置机制。
7. 自动配置类是什么?
大家从上往下看的时候时常看到自动配置类
,那到底什么是自动配置类呢?其实可以拆成两部分来看,第一部分是配置类,第二部分是自动化机制。对于这个感兴趣的朋友可以移步到这里继续学习—>自动配置类