Springboot配置(下)
九、配置文件的加载位置
Springboot启动的时候会扫描以下位置的application.properties或者application.yml文件作为Springboot的默认配置文件。
—file:./config/
—file:./
—classpath:/config/
—classpath:/
以上是按照优先级从高到低的顺序,高优先级配置内容会覆盖低优先级配置的内容。
所有位置的文件都会被加载,互补配置
配置文件优先级:1>2>3>4
我们也可以通过配置spring.config.location来改变默认位置(运维的时候很管用)
项目打包以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;
指定的配置文件和默认加载加载的配置文件会一起共同起作用形成互补配置
10、外部配置加载顺序
Springboot也可以从以下位置加载配置---->优先级从高到低,高优先级的配置覆盖低优先级的配置,若有不同的内容,所有配置会形成互补配置
1、命令行参数
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8082,--server.path=/abc
多个参数用空格分开:--配置项=值
2、来自java:comp/env的JNDI属性
3、java系统属性(System.getProperties())
4、操作系统环境变量
5、RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内寻找
优先加载带profile的
6、jar包外部的application-{profile}.properties或者application-{profile}.yml配置文件
7、jar包内部的application-{profile}.properties或者application-{profile}.yml配置文件
再加载不带profile的
8、jar外部的application.properties或者application.yml配置文件
9、jar包内部的application.properties或者application.yml配置文件
10、@Configuration注解类上的@PropertySource
11、通过SpringApplication.setDefaultProperties指定的默认属性
11、自动配置原理
1)、Springboot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
2)、@EnableAutoConfiguration作用:
- 利用:AutoConfigurationImportSelector给容器中导入一些组件
- 可以查看selectImports( )方法的内容:
- List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); 获取候选的配置
SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
该方法作用就是扫描所有jar包类路径下的:META-INF/spring.factories,把扫描到的类容包装成properties。从properties中获取到AutoConfigurationImportSelector.class类名对应的值,然后把他们添加到容器中。
一句话:就是将类路径下META-INF/spring.factories里面配置的EnableAutoConfiguration的值加入到容器中
每一个这样的xxxAutoConfiguration都是容器的一个组件,都加入到容器中,使用它们来进行自动配置。
3)、每一个自动配置类进行自动配置功能
4)、以HttpEncodingAutoConfiguration为例解释自动配置的原理
@Configuration//表示这是一个配置类,和以前的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties({HttpEncodingProperties.class})//启用指定类的ConfigurationProperties功能,
将配置文件中的对应的值和HTTPEncodingProperties绑定起来,并把HttpEncodingProperties加入到IOC容器中
@ConditionalOnWebApplication(//Spring底层注解@Condition,就是根据不同的条件,如果满足指定的条件整个配置类才会生效 type = Type.SERVLET //判断当前应用是不是web应用 )@ConditionalOnClass({CharacterEncodingFilter.class})//判断当前jar包中是不是有这个类CharacterEncodingFilter
CharacterEncodingFilter//是SpringMVC中进行乱码解决的过滤器@ConditionalOnProperty( //判断配置文件中是否存在某个配置----> spring.http.encoding.enabled,如果不存在也是成立的
//matchIfMissing 即使我们配置文件中不配置 spring.http.encoding.enabled,也是默认生效的
prefix = "spring.http.encoding", value = {"enabled"}, matchIfMissing = true)public class HttpEncodingAutoConfiguration {private final HttpEncodingProperties properties;//已经和Springboot的配置文件映射了 //只有一个构造函数的情况下,properties值就会从容器中拿 public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; }
@Bean //给容器中添加一个组件这个组件的某些值需要从properties中获取 @ConditionalOnMissingBean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpEncodingProperties.Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpEncodingProperties.Type.RESPONSE)); return filter; }
根据当前不同的条件判断,决定这个配置类是否生效
一旦生效,就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里的每个属性又是和配置文件绑定的。
#我们能配置的属性都是来源于properties这个类 spring.http.encoding.enabled=true spring.http.encoding.charset=utf-8 spring.http.encoding.force=true
5)、所有在配置文件能配置的属性都是在xxxProperties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类。
@ConfigurationProperties(//从配置文件中获取指定的值和bean的属性进行绑定 prefix = "spring.http.encoding" ) public class HttpEncodingProperties {
Springboot的精髓:
1)、Springboot启动会加载大量的自动配置类
2)、我们看我们需要的功能有没有Springboot默认写好的自动配置类
3)、再来看这个自动配置类中到底配置了哪些组件(只要我们需要的有,就不需要配置了)
4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值想·
xxxAutoConfiguration:自动配置类,给容器中添加组件
xxxProperties:封装配置文件中相关属性
@Conditional
1、@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必须是@Condition条件成立,才给容器中添加组件,配置类里面的所有类容菜生效
自动配置类必须在一定的条件下才会生效:
我们可以通过启用debug=true属性,来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效。