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

到此這篇關(guān)于SpringBoot YAML 配置讀取機(jī)制 + 數(shù)據(jù)庫(kù)自動(dòng)初始化原理解析的文章就介紹到這了,更多相關(guān)SpringBoot YAML 配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA 安裝及初次使用圖文教程(2020.3.2社區(qū)版)
這篇文章主要介紹了IntelliJ IDEA 安裝及初次使用(2020.3.2社區(qū)版),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
SpringCloud?Ribbon負(fù)載均衡流程分析
在Eureka注冊(cè)中心中我們?cè)谔砑油闌LoadBalanced注解,即可實(shí)現(xiàn)負(fù)載均衡功能,現(xiàn)在一起探索一下負(fù)載均衡的原理(Ribbon),感興趣的朋友一起看看吧2024-03-03
Spring Boot集成FreeMarker 時(shí)訪問(wèn)不到.ftl文件的配置步驟
Spring Boot 要集成 FreeMarker 模板引擎時(shí)必須經(jīng)過(guò)正確的配置,大致可分為5 個(gè)步驟,下面分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
java使用tess4j進(jìn)行圖片文字識(shí)別功能
Tess4J?是Java?(JNA)?對(duì)?Tesseract?OCR?API?的封裝,Tess4J是java直接可使用的jar包,而Tesseract?OCR是支持Tess4J進(jìn)文件文字識(shí)別的基礎(chǔ),Tess4J可直接使用Maven方式引入,這篇文章主要介紹了java使用tess4j進(jìn)行圖片文字識(shí)別,需要的朋友可以參考下2023-04-04
java中如何把實(shí)體類(lèi)轉(zhuǎn)成json格式的字符串
這篇文章主要介紹了java中如何把實(shí)體類(lèi)轉(zhuǎn)成json格式的字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java數(shù)據(jù)開(kāi)發(fā)輔助工具Docker與普通程序使用方法
這是為數(shù)據(jù)開(kāi)發(fā)人員使用的輔助工具,用于數(shù)據(jù)庫(kù)之間的表同步,說(shuō)同步并不嚴(yán)謹(jǐn),因?yàn)椴皇菍?shí)時(shí)更新的,更確切的說(shuō)法是復(fù)制,可以方便的從一個(gè)數(shù)據(jù)庫(kù)復(fù)制表到另一個(gè)數(shù)據(jù)庫(kù),以下遇到同步的詞請(qǐng)理解為復(fù)制2021-09-09
Spring?Boot中使用Redis實(shí)戰(zhàn)案例
redis作為一個(gè)高性能的內(nèi)存數(shù)據(jù)庫(kù),如果不會(huì)用就太落伍了,之前在 node.js中用過(guò) redis,本篇記錄如何將 redis 集成到 spring boot 中,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot中使用Redis的相關(guān)資料,需要的朋友可以參考下2023-04-04

