最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot YAML 配置讀取機制 + 數(shù)據(jù)庫自動初始化原理解析

 更新時間:2025年12月02日 15:05:02   作者:程序員三明治  
本文介紹了SpringBoot中YAML配置的讀取流程,包括配置文件加載、配置綁定和容器管理,還詳細(xì)講解了數(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 配置讀取機制 + 數(shù)據(jù)庫自動初始化原理解析的文章就介紹到這了,更多相關(guān)SpringBoot YAML 配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IntelliJ IDEA 安裝及初次使用圖文教程(2020.3.2社區(qū)版)

    IntelliJ IDEA 安裝及初次使用圖文教程(2020.3.2社區(qū)版)

    這篇文章主要介紹了IntelliJ IDEA 安裝及初次使用(2020.3.2社區(qū)版),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringCloud?Ribbon負(fù)載均衡流程分析

    SpringCloud?Ribbon負(fù)載均衡流程分析

    在Eureka注冊中心中我們在添加完@LoadBalanced注解,即可實現(xiàn)負(fù)載均衡功能,現(xiàn)在一起探索一下負(fù)載均衡的原理(Ribbon),感興趣的朋友一起看看吧
    2024-03-03
  • SpringBoot自動裝配原理詳解

    SpringBoot自動裝配原理詳解

    這篇文章主要詳細(xì)介紹了SpringBoot的自動裝配原理,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考一下
    2023-04-04
  • Spring Boot集成FreeMarker 時訪問不到.ftl文件的配置步驟

    Spring Boot集成FreeMarker 時訪問不到.ftl文件的配置步驟

    Spring Boot 要集成 FreeMarker 模板引擎時必須經(jīng)過正確的配置,大致可分為5 個步驟,下面分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-04-04
  • java使用tess4j進(jìn)行圖片文字識別功能

    java使用tess4j進(jìn)行圖片文字識別功能

    Tess4J?是Java?(JNA)?對?Tesseract?OCR?API?的封裝,Tess4J是java直接可使用的jar包,而Tesseract?OCR是支持Tess4J進(jìn)文件文字識別的基礎(chǔ),Tess4J可直接使用Maven方式引入,這篇文章主要介紹了java使用tess4j進(jìn)行圖片文字識別,需要的朋友可以參考下
    2023-04-04
  • java并發(fā)編程之同步器代碼示例

    java并發(fā)編程之同步器代碼示例

    這篇文章主要介紹了java并發(fā)編程之同步器代碼示例,分享了相關(guān)代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • java中如何把實體類轉(zhuǎn)成json格式的字符串

    java中如何把實體類轉(zhuǎn)成json格式的字符串

    這篇文章主要介紹了java中如何把實體類轉(zhuǎn)成json格式的字符串問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java數(shù)據(jù)開發(fā)輔助工具Docker與普通程序使用方法

    Java數(shù)據(jù)開發(fā)輔助工具Docker與普通程序使用方法

    這是為數(shù)據(jù)開發(fā)人員使用的輔助工具,用于數(shù)據(jù)庫之間的表同步,說同步并不嚴(yán)謹(jǐn),因為不是實時更新的,更確切的說法是復(fù)制,可以方便的從一個數(shù)據(jù)庫復(fù)制表到另一個數(shù)據(jù)庫,以下遇到同步的詞請理解為復(fù)制
    2021-09-09
  • Spring?Boot中使用Redis實戰(zhàn)案例

    Spring?Boot中使用Redis實戰(zhàn)案例

    redis作為一個高性能的內(nèi)存數(shù)據(jù)庫,如果不會用就太落伍了,之前在 node.js中用過 redis,本篇記錄如何將 redis 集成到 spring boot 中,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot中使用Redis的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 使用nacos增加修改配置實時生效方式

    使用nacos增加修改配置實時生效方式

    文章介紹了如何在Nacos配置中心實現(xiàn)動態(tài)配置,包括添加或修改配置、使用`@RefreshScope`注解刷新Bean屬性、擴展動態(tài)配置參數(shù)等
    2026-01-01

最新評論

渭南市| 泉州市| 六枝特区| 齐齐哈尔市| 左权县| 海原县| 新竹市| 绥江县| 江阴市| 凤山县| 灵山县| 罗田县| 武汉市| 喀什市| 肥东县| 杂多县| 东兰县| 昌乐县| 郧西县| 盈江县| 金平| 灵璧县| 泰兴市| 淅川县| 玛纳斯县| 栾川县| 乌兰县| 永嘉县| 凤台县| 扎鲁特旗| 牡丹江市| 婺源县| 蓝山县| 饶阳县| 贵港市| 彭阳县| 中宁县| 稷山县| 深州市| 赣州市| 罗田县|