6. 配置文件的加载位置
配置文件的默认加载位置:类路径下classpath:/
类路径:maven 项目构建之后的目录及结构的路径(target文件夹下的classes/)
- 除了默认的加载位置,一下位置的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可以从一下位置加载配置,优先级从高到低,高优先级覆盖低优先级,最后形成互补配置
- 命令行配置,像上面的操作先打包,在进行命令行操作
在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