SpringBoot2-配置
springboot配置
配置文件
配置文件的名字是固定的
application.properties
applicstion.yml
YAML 是一个标记语言,不是一个标记语言
标记语言
 以前的配置文件大多是xml文件,yaml以数据为中心,比json、xml等更适合做配置文件
 这是yml
1  | server:  | 
这个是xml
1  | <server>  | 
yml语法
基本语法
 k:(空格)v 表示一对键值对
 用空格锁进来控制层级关系,只要左对齐就都是一个层级的,属性和值也是大小写敏感的
1  | server:  | 
值的写法
字面量: 普通的值、字符串、bool,
字符串默认不用加上双引号和单引号
1  | s1: 'a\nb'  | 
等加于下面等js
1  | {s1: 'a\\nb',s2: 'a\nb'}  | 
对象、map
对象的写法
1  | friends:  | 
行内写法
1  | friends: {lastName: zhangsan,age: 18}  | 
数组 list set
用-表示数组中的元素
1  | pets:  | 
行内写法
1  | pest: [cat,dog,pig]  | 
配置文件注入
 @ConfigurationProperties 告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定, prefix = “person”: 配置文件中哪个下面的所有属性一一映射
 @Data 来自动生成tostring,@Component来把这个类放到容器中,@ConfigurationProperties来从配置文件注入数据
1  | 
  | 
Dog同理
1  | 
  | 
导入依赖
1  | <!-- 导入配置文件处理器,配置文件进行绑定就会有提示-->  | 
开始测试
1  | 
  | 
我们看到输出
1  | Person(lastName=zhangsan, age=18, boss=false, birth=Tue Dec 12 00:00:00 CST 2017, maps={k1=v1, k2=v2}, lists=[lisi, zhaoliu], dog=Dog(name=dogname, age=2))  | 
改写为properties
1  | person.last-name=zhangsan  | 
注解注入
 详见@Value
 @Value(“$(person.last-name)”) 从环境变量和配置文件中获得值
 @Value(“#{111213}”) 从表达式中获得值
 @Value(“true”) 
@PropertySource和@ImportResource
 @PropertySource可以指定配置文件,还可以写数组加载多个配置文件,
 @ImportResource导入Spring的配置文件,让配置文件中的内容生效,即我们以前写的spring的那些东西springboot是不会识别的,必须通过ImportResource才能成功,springboot不推荐这个注解
 springboot推荐全注解形式,使用@Configuration,这个配置类就是来替代spring的配置文件的,当然这个就是spring的注解,然后在方法上加入@Bean注解就能吧这个方法的返回值注入到容器中,注意这里的都是spring中的注解
1  | 
  | 
配置文件占位符
${random.value},${random.int},${random.long},${random.int[1024,65536]}表示随机数,${..}中间写之前配置的值可以取出来
1  | person.last-name=zhangsan${random.uuid}  | 
多profile
创建多个配置文件application-{profile}.properties/yml
激活profile
在主配置文件中写 spring.profile.active = dev, 就可以激活application-dev.properties
yml多文档块
下面定义了三个文档块,并激活了第三个文档块
1  | server:  | 
用命令行激活
1  | --spring.properties.active=dev  | 
用虚拟机参数激活
1  | -Dspring.properties.active=dev  | 
配置文件加载顺序
1 file:./config/
2 file:./
3 classpath:/config
4 classpath:/
 从上到下,优先级从高到低,高优先级的会覆盖低优先级的内容,注意是覆盖,而不是看了高优先级的配置以后就不看低优先级的配置了,还可以通过命令行参数设置–spring.config.localtion指定配置文件路径,这里也是互补配置
外部配置文件
优先加载profile的,由外部到内部加载
自动配置原理
 去查官方文档
 SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration ,利用EnableAutoConfigurationImportSelect导入组件,每一个xxxAutoConfiguration都是容器中的一个组件,都加入到容器中,用他们来做自动配置,每一个自动配置类进行自动配置功能
HttpEncodingAutoConfiguration
 根据当前不同的条件判断,决定当前这个配置类是否生效
 Configuration 表明配置类
 EnableConfigurationProperties 启动指定类的ConfigurationProperties功能,到HttpProperties中看到这个类上有ConfigurationProperties
 ConditionalOnWebApplication Conditionalxx是spring中的注解,根据不同的条件,如果满足指定条件,整个配置类中的配置才会生效,这里判断当前应用是否为web应用
 ConditionalOnClass 判断当前项目中有没有这个类,
 CharacterEncodingFilter SpringMVC中进行乱码解决的过滤器
 ConditionalOnProperties 判断配置文件中是否存在某个配置
1  | 
  | 
所有在配置文件中能配置的属性都是在xxxProperties中封装着
1  | 
  | 
xxxAutoConfiguration
自动配置类
xxxProperties
封装配置文件中相关属性
Condition
| @Conditional | 作用 | 
|---|---|
| @ConditionalOnjava | java版本是否符合要求 | 
| @ConditionalOnBean | 容器中存在指定Bean | 
| @ConditionalOnMissingBean | 容器中不存在指定Bean | 
| @ConditionalOnExpression | 满足SpEL表达式 | 
| @ConditionalOnClass | 系统中有指定的类 | 
| @ConditionalOnMissingClass | 系统中没有指定的类 | 
| @ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选 | 
| @ConditionalOnProperty | 系统中指定的属性是否有指定的值 | 
| @ConditionalOnResource | 类路径下是否存在指定资源文件 | 
| @ConditionalOnWebApplication | 当前项目为web项目 | 
| @ConditionalOnNotWebApplication | 当前不是web项目 | 
| @ConditionalOnJndi | JNDI存在指定项 | 
自动配置生效
 只有在特定的条件下才能生效
 启用debug=true让控制台打印自动配置报告
1  | debug=true  | 
