SpringBoot YAML 配置讀取機(jī)制 + 數(shù)據(jù)庫自動初始化原理解析
一、YAML 配置的讀取流程(核心:配置綁定)
SpringBoot 讀取 YAML 配置的核心是 “將配置文件中的鍵值對綁定到 Java 實體類”,再由 Spring 容器管理這些實體類,供后續(xù)組件使用。整個流程分 3 步:
1. 配置文件加載:SpringBoot 自動識別 YAML
- SpringBoot 啟動時,會默認(rèn)掃描 src/main/resources 目錄下的application.yml (或 application.properties),這是 “約定大于配置” 的體現(xiàn)(無需手動指定配置文件路徑)。
- 加載邏輯:由ConfigFileApplicationListener 負(fù)責(zé),它會監(jiān)聽 Spring 啟動事件,自動加載默認(rèn)配置文件,將配置內(nèi)容解析為PropertySource(配置源),存入 Spring 的Environment(環(huán)境上下文)中。
2. 配置綁定:將 YAML 鍵值對映射到 Java 類
SpringBoot 提供兩種核心綁定方式,數(shù)據(jù)庫配置主要用第二種:
(1)@Value 注解(單個配置項綁定)
適合少量配置項,直接通過 ${key} 注入到 Bean 中:
@Service
public class UserService {
// 綁定 YAML 中的 spring.datasource.url
@Value("${spring.datasource.url}")
private String dbUrl;
}(2)@ConfigurationProperties 注解(批量綁定,核心)
適合多配置項(如數(shù)據(jù)庫連接信息、Redis 配置等),通過 prefix 指定 YAML 中的層級前綴,自動將該前綴下的所有配置項綁定到實體類的字段上:
// 綁定 YAML 中 "spring.datasource" 前綴的所有配置
@ConfigurationProperties(prefix = "spring.datasource")
@Data // Lombok 簡化 getter/setter(必須有 getter/setter 才能綁定)
public class DataSourceProperties {
private String url; // 對應(yīng) spring.datasource.url
private String username; // 對應(yīng) spring.datasource.username
private String password; // 對應(yīng) spring.datasource.password
private String driverClassName; // 對應(yīng) spring.datasource.driver-class-name
}
3. 容器管理:綁定后的配置類成為 Spring Bean
- 要讓@ConfigurationProperties生效,需通過@EnableConfigurationProperties
<font style="color:rgb(0, 0, 0);">@</font>啟用,或直接在配置類上加@Component 注解,使其被 Spring 組件掃描識別:
@Configuration
// 啟用 DataSourceProperties 配置綁定,并將其注冊為 Spring Bean
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceConfig {
}
二、數(shù)據(jù)庫自動初始化原理(核心:自動配置 + 配置綁定)
你在 YAML 中填寫數(shù)據(jù)庫信息后,SpringBoot 能自動初始化 <font style="color:rgba(0, 0, 0, 0.85) !important;">DataSource</font>、<font style="color:rgba(0, 0, 0, 0.85) !important;">SqlSessionFactory</font>,本質(zhì)是 “自動配置類 + 配置綁定后的屬性” 協(xié)同工作,流程如下:
前提:引入對應(yīng)的 Starter 依賴
要觸發(fā)數(shù)據(jù)庫自動配置,需先引入 Starter 依賴(以 MyBatis 為例):
<!-- SpringBoot JDBC Starter:提供數(shù)據(jù)源自動配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MyBatis Starter:提供 SqlSessionFactory 自動配置 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>- Starter 依賴會自動引入所需的核心組件(如
<font style="color:rgb(0, 0, 0);">HikariDataSource</font>、<font style="color:rgb(0, 0, 0);">MyBatis</font>核心包),并觸發(fā)對應(yīng)的自動配置類。
1. 自動配置類:DataSourceAutoConfiguration(初始化 DataSource)
SpringBoot 內(nèi)置DataSourceAutoConfiguration 類(屬于spring-boot-starter-jdbc ),其核心邏輯是:
(1)條件觸發(fā)
- 當(dāng)classpath 中存在DataSource 類(由 Starter 引入),且容器中沒有手動定義的DataSource Bean 時,該自動配置類生效(@Conditional注解控制)。
(2)依賴配置綁定后的屬性
DataSourceAutoConfiguration`` 會自動注入我們通過 YAML 綁定的DataSourceProperties :
// SpringBoot 內(nèi)置的自動配置類(簡化源碼)
@Configuration
@ConditionalOnClass(DataSource.class) // 存在 DataSource 類時生效
@EnableConfigurationProperties(DataSourceProperties.class) // 啟用數(shù)據(jù)源配置綁定
public class DataSourceAutoConfiguration {
// 注入綁定了 YAML 配置的 DataSourceProperties
@Autowired
private DataSourceProperties dataSourceProperties;
// 自動創(chuàng)建 DataSource Bean,注入 Spring 容器
@Bean
@ConditionalOnMissingBean // 容器中沒有 DataSource 時才創(chuàng)建
public DataSource dataSource() {
// 用 DataSourceProperties 中的屬性(YAML 配置的數(shù)據(jù)庫信息)初始化 DataSource
return DataSourceBuilder.create()
.url(dataSourceProperties.getUrl())
.username(dataSourceProperties.getUsername())
.password(dataSourceProperties.getPassword())
.driverClassName(dataSourceProperties.getDriverClassName())
.build();
}
}- 最終創(chuàng)建的DataSource 是 SpringBoot 默認(rèn)的HikariDataSource (高性能連接池),也可通過 YAML 配置切換為 Druid 等其他連接池。
2. 自動配置類:MybatisAutoConfiguration(初始化 SqlSessionFactory)
Mybatis-spring-boot-starter 引入了MybatisAutoConfiguration 類,核心邏輯:
(1)條件觸發(fā)
- 當(dāng)classpath 中存在SqlSessionFactory 類(MyBatis 核心類),且容器中已存在DataSource Bean(由DataSourceAutoConfiguration 創(chuàng)建)時,生效。
(2)依賴 DataSource 和 MyBatis 配置
- 自動注入DataSource (上一步創(chuàng)建的 Bean),并讀取 YAML 中mybatis 前綴的配置(如mapper-locations):
/**
* MyBatis 自動配置類:根據(jù) YAML 配置和 DataSource 自動創(chuàng)建 SqlSessionFactory
*/
@Configuration // 標(biāo)識為配置類
// 當(dāng)類路徑中存在 SqlSessionFactory 和 DataSource 時才生效(確保依賴已引入)
@ConditionalOnClass({SqlSessionFactory.class, DataSource.class})
// 啟用 MyBatisProperties 配置綁定(關(guān)聯(lián) YAML 中 mybatis 前綴的配置)
@EnableConfigurationProperties(MyBatisProperties.class)
public class MybatisAutoConfiguration {
// 注入 Spring 容器中的 DataSource(由 DataSourceAutoConfiguration 自動創(chuàng)建)
private final DataSource dataSource;
// 注入綁定了 YAML 配置的 MyBatisProperties(包含 mybatis.mapper-locations 等配置)
private final MyBatisProperties mybatisProperties;
// 構(gòu)造函數(shù)自動注入依賴(Spring 自動匹配容器中的 Bean)
public MybatisAutoConfiguration(DataSource dataSource, MyBatisProperties mybatisProperties) {
this.dataSource = dataSource;
this.mybatisProperties = mybatisProperties;
}
/**
* 自動創(chuàng)建 SqlSessionFactory Bean,注入 Spring 容器
* @ConditionalOnMissingBean:如果用戶手動定義了 SqlSessionFactory,則此方法不生效(優(yōu)先使用用戶配置)
*/
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory() throws Exception {
// 1. 創(chuàng)建 MyBatis 提供的 SqlSessionFactoryBean(用于構(gòu)建 SqlSessionFactory)
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
// 2. 設(shè)置數(shù)據(jù)源(使用自動配置的 DataSource,關(guān)聯(lián) YAML 中的數(shù)據(jù)庫連接信息)
sessionFactoryBean.setDataSource(dataSource);
// 3. 配置 Mapper 映射文件路徑(從 MyBatisProperties 中讀取 YAML 配置的 mybatis.mapper-locations)
// 例如 YAML 中配置 mybatis.mapper-locations: classpath:mapper/*.xml
sessionFactoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources(mybatisProperties.getMapperLocations()) // 解析配置的路徑
);
// 4. 其他配置(可選):如 MyBatis 全局配置文件、類型別名等(均來自 YAML 配置)
if (mybatisProperties.getConfigLocation() != null) {
// 配置 mybatis.config-location: classpath:mybatis-config.xml(自定義 MyBatis 全局配置)
sessionFactoryBean.setConfigLocation(
new PathMatchingResourcePatternResolver().getResource(mybatisProperties.getConfigLocation())
);
}
// 設(shè)置類型別名包(mybatis.type-aliases-package: com.example.entity)
sessionFactoryBean.setTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage());
// 5. 構(gòu)建并返回 SqlSessionFactory 實例
return sessionFactoryBean.getObject();
}
}最終效果
無需手動編寫 DataSource、SqlSessionFactory 的配置代碼,SpringBoot 通過“自動配置類”+“YAML 配置綁定”,自動完成初始化并注冊為 Spring Bean。
后續(xù)使用時,直接注入 Mapper 接口或 JdbcTemplate 即可:
@RestController
public class UserController {
@Autowired
private UserMapper userMapper; // 直接注入,無需手動配置
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userMapper.selectById(id);
}
}三、核心邏輯總結(jié)(一張圖看懂)

到此這篇關(guān)于SpringBoot YAML 配置讀取機(jī)制 + 數(shù)據(jù)庫自動初始化原理解析的文章就介紹到這了,更多相關(guān)SpringBoot YAML 配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC參數(shù)傳遞之基本數(shù)據(jù)類型和復(fù)雜對象說明
這篇文章主要介紹了SpringMVC參數(shù)傳遞之基本數(shù)據(jù)類型和復(fù)雜對象說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
JAVA實現(xiàn)Excel和PDF上下標(biāo)的操作代碼
這篇文章主要介紹了JAVA實現(xiàn)Excel和PDF上下標(biāo),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
如何通過ServletInputStream讀取http請求傳入的數(shù)據(jù)
這篇文章主要介紹了如何通過ServletInputStream讀取http請求傳入的數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

