yml配置文件、加载顺序、配置原理

本文详细介绍了SpringBoot的YML配置文件、配置加载顺序及自动配置的原理。通过示例展示了如何使用@Bean注解添加组件到SpringBoot容器,并解释了@ConfigurationProperties与@Value的区别。此外,还探讨了Profile文件在不同环境中的应用。最后,解析了SpringBoot的加载顺序,以及自动配置类如何从spring.factories加载并进行组件配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot学习之路(五)- yml配置文件、加载顺序、配置原理

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code,Keep progress,make a better result.
Survive during the day and develop at night。

目录

概 述

SpringBoot 初步开始

server:
port: 8081

8081

properties配置文件:

@Value获取值和@ConfigurationProperties获取值比较
@Value获取值和@ConfigurationProperties获取值比较

创建方式

c、@Bean 注解:SpringBoot 添加组件配置类的方式
b方式在开发的时候太麻烦,需要写配置文件,还得在启动类上配置加载进去。
SpringBoot推荐给容器中添加组件的方式:
1)、 创建配置类,配置要注入的类

package com.yhhy.springboot.springboot.config;
import com.yhhy.springboot.springboot.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @Configuration: 指明当前类是一个配置类,就是来替代之前的Spring配置文件
 * spring配置时:<bean></bean>标签添加组件的
 */
@Configuration
public class MyAppConfig {
    /**
     * Bean注解:能标注在方法上,也能作为原注解;
     * 将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
     * @return
     */
    @Bean
    public HelloService helloService(){
        System.out.println("配置类@Bean给容器中添加组件了");
        return new HelloService();
    }
}


可以看出来,此service是注入到容器中了,而且不用写第一种方法的xml和在主配置类上也不用加导入注解了;

SpringBoot 默认使用方法名作为类存放到容器的ID,这点要注意,例如我要改了方法名称后,获取需用最新的方法名;

4、Profile 文件
Profile是spring对不同环境提供不同配置功能的支持(开发、测试、生产),可以通过激活指定参数等方式快读切换环境。
默认使用application.proerties ,可以激活使用相关环境配置文件

3.激活指定profile
在配置文件properties中指定配置 spring.profiles.active=dev
命令行方式激活

二、加载顺序
SpringBoot也可以从以下位置加载配置;
优先级从高到低
高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置

三、自动配置原理
SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

@EnableAutoConfiguration作用:
点进去之后:利用@Import(EnaableAutoConfigurationImportSelector.class)给容器导入了一些;
EnaableAutoConfigurationImportSelector.class作
getCandidateConfigurations点进去之后:

SpringFactoriesLoader.loadFactoryNames()
扫描所有jar包类路径下 META-INF/spring.factories
把扫描到的这些文件的内容包装成properties对象
从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中.
每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置;

SpringBoot精髓:
​ 1)、SpringBoot启动会加载大量的自动配置类

​ 2)、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;

​ 3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)

​ 4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;

总结:

相关工具如下:

分析:

小结:

yml配置文件、加载顺序、配置原理~

参考资料和推荐阅读

1.链接: (https://blog.youkuaiyun.com/qq_36698956/article/details/85994093).

### Spring Boot 加载和解析配置文件原理 Spring Boot 应用程序在启动期间会自动查找并加载多个可能存在的配置文件,这些文件可以位于不同的位置,并遵循特定的优先级顺序。当应用程序启动时,`SpringApplication.run()` 方法触发了一系列初始化操作,其中包括发布 `ApplicationEnvironmentPreparedEvent` 事件[^1]。 此事件被各种监听器捕获,特别是那些负责处理外部化配置的部分。其中最核心的是 `ConfigFileApplicationListener` 类,该类实现了对不同类型的属性源的支持,比如 `.properties`, `.yml` 或者其他格式的配置文件。一旦检测到此类资源的存在,便会将其内容转换成键值对形式存储于内存之中以便后续访问使用[^3]。 对于默认路径下的配置文件(如 `application.properties`),其搜索范围涵盖了以下几个主要目录: - 当前项目的根目录下 (`./config/`) - 当前项目根目录 - classpath 的 `/config` 子目录内 - classpath 根部 按照上述次序依次尝试读取同名文件;如果存在相同名称但在更靠后的路径,则后者将会覆盖前者中的设置项。此外,还可以利用命令行参数、环境变量等方式动态指定额外的配置文件来满足灵活部署的需求。 为了支持更加复杂的场景需求,开发者也可以编写自己的逻辑来自定义加载过程。这通常涉及到创建一个新的 `PropertySource` 并注册给当前的应用上下文。例如,在某些情况下可以通过实现 `ApplicationContextInitializer` 接口或者继承 `AbstractContextLoaderInitializer` 来达到目的[^2]。 ```java // 自定义 PropertySourcesPlaceholderConfigurer 示例代码 @Configuration public class CustomConfiguration { @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { final PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); Resource[] resources = new ClassPathResource[]{new ClassPathResource("custom-config.properties")}; configurer.setLocations(resources); return configurer; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值