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

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

 更新時(shí)間:2025年12月02日 15:05:02   作者:程序員三明治  
本文介紹了SpringBoot中YAML配置的讀取流程,包括配置文件加載、配置綁定和容器管理,還詳細(xì)講解了數(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ě) DataSourceSqlSessionFactory 的配置代碼,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ū)版)

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

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

    在Eureka注冊(cè)中心中我們?cè)谔砑油闌LoadBalanced注解,即可實(shí)現(xiàn)負(fù)載均衡功能,現(xiàn)在一起探索一下負(fù)載均衡的原理(Ribbon),感興趣的朋友一起看看吧
    2024-03-03
  • SpringBoot自動(dòng)裝配原理詳解

    SpringBoot自動(dòng)裝配原理詳解

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

    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í)別功能

    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并發(fā)編程之同步器代碼示例

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

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

    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與普通程序使用方法

    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)案例

    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
  • 使用nacos增加修改配置實(shí)時(shí)生效方式

    使用nacos增加修改配置實(shí)時(shí)生效方式

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

最新評(píng)論

清远市| 遵义县| 惠安县| 淮滨县| 铁岭市| 正定县| 东阳市| 临安市| 和平区| 乌兰浩特市| 崇仁县| 虎林市| 西乌| 陇南市| 锡林郭勒盟| 安阳市| 漯河市| 山西省| 古蔺县| 米泉市| 来凤县| 玛多县| 桃源县| 博白县| 湟源县| 南平市| 宾阳县| 金昌市| 铜山县| 齐齐哈尔市| 涪陵区| 玉林市| 利川市| 汉寿县| 常山县| 桐柏县| 平南县| 广饶县| 逊克县| 凉山| 内丘县|