Spring boot(3)配置--配置文件Ⅱ--配置原理

6. 配置文件的加载位置

配置文件的默认加载位置:类路径下classpath:/
类路径:maven 项目构建之后的目录及结构的路径(target文件夹下的classes/)

  1. 除了默认的加载位置,一下位置的application.properties/application.yml Spring boot也会扫描
file:./config/    项目文件下的config/application.xxx
file:./               项目文件的根目录下
classpath:/config   类路径的 config/application.xxx      [此时的类路径就是resource 文件夹下,构建之后就是类路径]
classpath:/             类路径的根目录下

以上按照优先级从高到低的顺序,所有位置的文件都会被加载 最后会形成互补配置,优先级高的配置会覆盖优先级低的配置的相同内容,只是覆盖相同的内容
2.
通过spring.config.location 来改变默认的配置文件的位置
县厚木打包好哟吼。我们可以通过命令行参数的形式,在启动项目的时候来制定配置文件的新位置,指定的配置文件和默认加载的配置文件共同构成项目的配置文件(形成互补配置)
例如:
在这里插入图片描述
先执行打包,打包之后可以看见打包好的jar 包target\spring_demo-0.0.1-SNAPSHOT.jar,然后点击3打开快捷窗口

E:\JAVA\Code\spring_demo\target>java -jar spring_demo-0.0.1-SNAPSHOT.jar --spring.config.location=E:/JAVA/application.properties

7. 外部配置的加载顺序

spring Boot可以从一下位置加载配置,优先级从高到低,高优先级覆盖低优先级,最后形成互补配置
在这里插入图片描述

  1. 命令行配置,像上面的操作先打包,在进行命令行操作
    在target 目录下:
    target>java -jar 当前项目的jar 包 *--spring.config.location=操作语句*(在配置文件中怎么写这里就怎么写)
    多个配置用空格分开

6-9 的配置方式:优先加载带profile的再加载不带Profile的。由jar 包外向jar 包内加载【官方文档】

8.自动配置的原理

最全面的介绍就是官方文档

自动配置

自动配置是springboot 的灵魂

spring boot项目启动的时候加载著配置类,开启了自动配置的功能,@SpringBootApplication
这个标签下的@EnableAutoConfiguration 向容器中导入了大量的组件

1. 扫描主配置类所在的包下的所有组件将他们都加入容器中
2. 通过择器:EnableAutoConfigurationImportSelector 选择器,获取候选配置(所有的配置都以全类名的方式记录),
扫描所有jar 包类路径(META-INF/spring.properties)下的spring.properties 文件,将这些文件的内容封装成proeprties 对象,
然后从这个properties 文件中获取AnableAutoConfigurantion.class 这个类名对应的值,然后把他们添加到容器中

注意:有些spring.properties 文件中有EnableAutoConfiguration.class 有些spring.properties 文件中是没有的
所以自动配置的核心:将类路径下 META-INF/spring.properties 里面配置的所有EnableAutoConfiguration 的值加到了容器中在这里插入图片描述
EnableAutoConfigurantion 的值xxxAutoConfiguration 类都是容器中的一个组件,都加载到容器中;就是使用它们完成自动配置
3. 每一个自动配置类进行自己的自动配置
以HttpEnableAutoCfinguration 为例:

@Configuration        
表示这是一个配置类,相当于配置文件可以通过它向容器中添加组件      
                
@EnableConfigurationProperties({HttpProperties.class})      【HttpProperties.class】
启动指定类的@ConfigurationProperties 功能,指定类:HttpProperties ;【并且会把HttpProperties 添加到容器中】

@ConditionalOnWebApplication(
    type = Type.SERVLET
)
【spring底层的注解:@Contional 根据不同的条件判断,满足条件配置类才能生效】
判断当前应用是否为web 应用;是,当前配置类才能生效,才能@Bean向容器中添加配置

@ConditionalOnClass({CharacterEncodingFilter.class})
判断当前配置类中与没有CharacterEncodingFilter这个类【处理乱码】

@ConditionalOnProperty(
    prefix = "spring.http.encoding",
    value = {"enabled"},
    matchIfMissing = true
)
判断当前配置文件中是否存在某个配置:spring.http.encoding.enabled当他的值为:true生效,但是如果为false 也成立
总:即使spring.http.encoding.enabled = true 也生效



public class HttpEncodingAutoConfiguration {
    private final Encoding properties;
    public HttpEncodingAutoConfiguration(HttpProperties properties) {
        this.properties = pr}
只有一个有参构造器的情况下,参数会从容器中拿      

根据当前的条件判断当前配置类是否生效=====如果当前配置文件生效:

@Bean                  
给容器添加一个组件,并且此时可以知道他的某些组件要从本类的属性properties 中获取
【private final Encoding  properties ;】Enocoding 是HttpProperties 中的一个类。
所以properties已经和Springboot的配置文件【spring.http】绑定

@ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
 	CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
 	filter.setEncoding(this.properties.getCharset().name());
 	filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
    filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
    return filter;
    }

HTTPProperties 类:

@ConfigurationProperties(
    prefix = "spring.http"
)
【配置文件注入】这是一个javaBean 已经和配置文件绑定,从配置文件中获取指定的值
这个类中有什么属性就能配置什么属性
public class HttpProperties {
private boolean logRequestDetails;

所有的配置文件中能配置的属性都在xxxproperties 类中封装着:这些类上都有@Configuration Application 标注【实现配置文件注入】,从而在配置文件中能配置什么属性就看在这些类中封装了什么属性

HttpEncodingAutoConfiguration 总结

就这个配置类而言,在配置文件中能配置什么属性<==private final Encoding properties ,Encoding又是HttpProperties 中的一个类,所以最后能配置的就是 spring.http.encoding.xxx

自动配置精髓:

1. springboot 启动大量的自动配置类
2.看看自己需要的功能时有没有SpringBoot 默认写好的自动配置类
3. 再看自动配置类中到底配置了那些组件(只要组件有我们就不需要再来配置) 如果没有我们需要的组件那就要自己自写配置类
4.给容器中添加组件时,会从properties 类中获取某些属性值,我们就可以在配置文件中自定义那些属性的值

xxxAutoConfiguration :自动配置类,向容器中添加组件
xxxproperties :疯转配置文件中的相关属性

自己在写配置类时,过程都是一样的

自动配置类虽然多但是都有执行的条件

问题:那些自动配置类是生效的,只有知道那些时生效的才能知道容器中添加了那些组件,才知道配置文件中能修改那些

通过在主配置文件中打开debug 模式:debug=true     
在控制台就会出现自动配置类报告:

Postive  matches  就是生效的自动配置类
Nagetive  matches  没有生效的自动配置类


掌握点:
1.自动配置原理
2.@Contional 注解  判断条件的注解,返回值true/false

猜你喜欢

转载自blog.csdn.net/Stitch__/article/details/88370493