SpringBoot中的文件加载顺序以及SpringBoot中的自动配置原理

1.配置文件加载位置

Springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

优先级由高到低,高优先级配置会覆盖低优先级的配置:
Spring boot会从这四个位置全部加载主配置文件夹;互补配置

  • -file:./config
  • -file:./
  • -classpath:/config
  • -classpath:/

通过Spring.config.location来改变默认的配置文件位置(打包成功的项目需要需改部分配置时只需要编写少量的配置把项目重新启动通过Spring.config.location加载新改的配置,不需要把整个项目改变再打包)

项目打包好以后可以使用命令行参数的形式,启动项目时来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;


2.外部配置加载顺序

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

  1. 命令行参数:java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=81 --spring.context-path=/abc 多个配置用空格分开;–配置项=值
  2. 来自java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找

优先加载带profile

  1. jar包外部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
  2. jar包内部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
  3. jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
  4. jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
  5. @Configuration注解类上的@PropertySource
  6. 通过SpringApplication.setDefaultProperties指定的默认属性

所有支持的配置加载来源:官方文档


3.自动配置原理

1.自动配置原理

配置文件到底能写什么?怎么写?自动配置原理:

配置文件能配置的属性参照

自动配置原理(关键)

  1. spring boot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
  2. @EnableAutoConfiguration的作用:
  • 利用AutoConfigurationImportSelector给容器中导入组件?
  • 可以查看selectImports()的方法的内容即可知道导入了那些组件;
  • List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置
SpringFactoriesLoader.loadFactoryNames()
扫描所有jar包所有类路径下的META-INF/spring.factories
把扫描到的这些文件的内容全部包装成properties对象
从properties获取到EnableAutoConfiguration.class这个类(类名)对应的值,然后把他们添加在容器中

将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到了容器中

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
.
.
.
.
.
.

每一个这样的xxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置;
3. 每一个自动配置类进行自动配置功能

  1. HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理:
//表示这是一个配置类,类似以前写的配置文件,也可以给容器中添加组件
@Configuration(
    proxyBeanMethods = false
)

//启用指定类的ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来,并把HttpEncodingProperties加入到IOC容器中
@EnableConfigurationProperties({ServerProperties.class})

//Spirng底层有一个@Conditional注解,根据不同的条件,可以自己进行条件判断,如果满足整个配置类中的配置就会生效;作用:判断当前应用是否是web应用,如果是那么当前配置类生效
@ConditionalOnWebApplication(
    type = Type.SERVLET
)

//作用:判断当前项目中是否有这个类CharacterEncodingFilter;Spring Mvc中进行解决乱码的过滤器
@ConditionalOnClass({CharacterEncodingFilter.class})

//判断配置文件中是否有某个配置server.servlet.encoding,如果不存在判断成立,即使配置文件中不配置server.servlet.encoding也是默认生效
@ConditionalOnProperty(
    prefix = "server.servlet.encoding",
    value = {"enabled"},
    matchIfMissing = true
)


public class HttpEncodingAutoConfiguration {

    //他已经和SpringBoot的配置文件映射了是在获取server.servlet.encoding中的值的
    private final Encoding properties;

    //只有一个有参构造器的情况下,参数的值就会从容器中拿
    public HttpEncodingAutoConfiguration(ServerProperties properties) {
        this.properties = properties.getServlet().getEncoding();
    }

//给容器中添加一个组件,把这个filter添加过去,这个组件中的有些熟悉需要从properties中获取
    @Bean
    //判断容器中没有这个组件,如果没有就添加这个组件
    @ConditionalOnMissingBean(CharaterEncodingFilter.class)
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));
        return filter;
    }

根据当前不同条件判断,判断这个配置类是否生效,一旦这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性都是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

我们能配置的属性都是来源于这个功能的properties

  1. 所有在配置文件能配置的属性都是在xxxxProperties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类
  • 例如HttpEncodingAutoConfiguration有一个@ConfigurationProperties(prefix = “server.servlet.encoding”)注解从配置文件中获取指定的值和bean的属性进行绑定

精髓:

  • SpringBoot启动时会加载大量自动配置类
  • 我们看我们需要的功能有没有springboot默认写好的自动配置类
  • 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用到组件有,我们就不需要再来配置了)
  • 给容器中自动配置类添加组件的时=时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性;

xxxxAutoCOnfiguration:自动配置类
给容器中添加组件
xxxxProperties:封装配置文件中的相关属性

2.细节

1.@Conditional派生注解(Spring注解版原生的Conditional作用)

作用:必须是@Conditional指定的条件成立,才能给容器中添加组件,配置类的里面所有内容才生效

SpringBoot扩展了很多@Conditional注解

自动配置类必须在一定条件下才能生效;

那么如何知道那些自动配置类生效呢?

我们可以在application.properties中通过启用debug=true属性,来让控制台打印自动配置报告,这样就可以知道哪些自动配置类生效:

positive match:自动配置类启用的,匹配上了

negativ match:自动配置类没有启用的,没有匹配上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 配置文件顺序如下: 1. 首先 application.properties 或 application.yml 文件,这是默认的配置文件。 2. 如果存在 profile 配置,则会对应的配置文件,例如 application-dev.properties 或 application-prod.yml。 3. 如果存在 spring.config.name 属性,则会指定名称的配置文件,例如 spring.config.name=myapp,会 myapp.properties 或 myapp.yml。 4. 如果存在 spring.config.location 属性,则会指定路径下的配置文件,例如 spring.config.location=/opt/myapp/config,会该路径下的所有配置文件。 5. 最后,还可以通过命令行参数或环境变量来指定配置文件的位置,例如 java -jar myapp.jar --spring.config.location=/opt/myapp/config。 总之,Spring Boot 配置文件顺序是非常灵活的,可以根据不同的需求来进行配置。 ### 回答2: Spring Boot是用来简化Spring应用程序的搭建和开发的框架。在开发Spring Boot应用程序时,我们需要按照所需的配置来设置配置文件。Spring Boot提供了不同类型的配置文件,如properties,YAML等,同时也提供了一种结合多个配置文件的方式,通过多个配置文件可以优化应用程序的配置管理和维护。对于SpringBoot多个配置文件次序问题,下面我们进行详细解答。 1. 优先级 SpringBoot配置文件有着非常明确和有序的优先级,优先级高的配置文件可以覆盖优先级低的配置文件。在同样的值定义在多个配置文件,优先级高的配置文件会覆盖优先级低的配置文件。下面是一些通用的排序规则: a. 配置文件的优先级顺序为:application.properties,application.yml,application.xml; b. 同一个目录下的配置文件,优先级由具体的文件名决定。 2. 顺序 Spring Boot启动时,会应用程序配置文件。Spring Boot配置文件是按照指定的顺序进行的。一般情况下,它们是以@SpringBootApplication标注的类所在的包为根目录进行相对于类路径的查找。在Spring Boot,我们需要了解到以下三类配置文件及其顺序: a. 全局配置文件 全局配置文件在Spring Boot启动时最先被,通常定义在classpath:config文件夹下。全局配置文件名字需要以application为前缀,后面可以使用.properties或.yml文件格式。 b. 指定配置文件 指定配置文件是Spring Boot非常常见的一种配置方式,通常通过命令行的参数来指定配置文件的路径或者直接将配置文件直接放置在指定的文件夹下。优先级高于全局配置文件,覆盖其定义的所有属性。 c. 外部配置文件 外部配置文件是在应用程序启动时最后被的,通常定义在/usr/share/myapp/application.yml这样的路径。它优先级最高,覆盖所有应用程序定义的配置。 总之,在Spring Boot配置文件的优先级是非常明确和有序的,并且可以被方便地以指定顺序进行覆盖,以达到优化应用程序配置管理和维护的效果。 ### 回答3: Spring Boot 是一个非常方便的框架,它可以通过 application.properties 或 application.yml 文件来管理应用程序的配置信息。Spring Boot 提供了一个非常方便的方式来解决应用程序的配置问题,即使用配置文件。但是,在使用配置文件时,有许多需要考虑的问题,例如:配置文件的命名,顺序等问题。 Spring Boot 的配置文件顺序如下: 1.项目根目录下的 /config 子目录 Spring Boot 首先会从项目根目录下的 /config 子目录读取配置文件。这样做的好处是可以保证配置文件的位置一致,比如可以将所有的配置文件放置在统一的位置,方便管理。 2.项目根目录 如果在 /config 子目录没有找到对应的配置文件,那么 Spring Boot 会从项目根目录读取配置文件。 3.classpath 的 /config 包 如果在项目根目录仍然没有找到对应的配置文件,那么 Spring Boot 会从 classpath 的 /config 包读取配置文件。 4.classpath 根路径下的文件 最后,如果以上三个位置都没有找到对应的配置文件,那么 Spring Boot 会从 classpath 根路径下读取配置文件。 总结: 在 Spring Boot 应用程序配置文件可以存放在多个位置,按照 Spring Boot 的顺序,按照优先级顺序查找配置文件。从根本上讲,Spring Boot 使用的是一个基于属性的配置体系结构,它允许应用程序从一组预定义的属性值选择适当的值,以便配置应用程序。只需遵循以上顺序,我们就可以轻松地管理我们的配置文件,并优化我们的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值