目录
3.4例子(使用@ConfigurationProperties赋值)
总结:@Value和@ConfigurationProperties区别:
9.3.以HttpEncodingAutoConfiguration为例解释自动配置原理:
一、配置文件
1.1springBoot使用一个全局的配置文件
配置文件名是固定的,(src/main/resources目录下)
-application.properties
-application.yml
1.2.yml 标记语言
YAML(YAML Ain't Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件
1.3可以对一些参数进行修改
如,端口号:server.port = 8081,例子如下:
1.3.1使用.properties文件配置:
1.3.2使用.yml配置
二、YAML语法
2.1基本语法
k空格V:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的;
属性和值大小写敏感;
2.2值的写法
2.2.1字面量:普通的值(数字、字符串、布尔);
k:v:字面量直接来写,字符串默认不用加上单引号或者双引号;
“”:双引号。name:“tchuhu \n haha”; 输出: tchuhu 换行 haha
'':单引号。name:'tchuhu \n haha'; 输出: tchuhu \n haha
2.2.2对象、Map
或者,行内写法:
2.2.3数组(List、Set)
行内写法:
三、使用
3.1建立Person类和Dog类
3.2在yml中赋值:
3.3映射
警告:(配置文件中会自动提示...)
解决方法:导入依赖
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3.4例子(使用@ConfigurationProperties赋值)
3.4.1使用YML配置文件
3.4.2使用Properties配置文件
@Value("#{'${imageType}'.split(',')}")
可能会乱码,修改Setting文件:
(idea默认为UTF-8,因此呢,配置文件需要将UTF-8转换为ASCII码,只需要打钩即可)
3.5例子(使用@Value赋值)
总结:@Value和@ConfigurationProperties区别:
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 一个一个指定 |
松散绑定(松散语法) | 支持,即:配置文件中N或-n | 不支持 |
SpEL | 不支持 | 支持,即:#{11*2} |
JSR303数据校验 | 支持,如:@Validated+@Email | 不支持 |
复杂类型,如map,list | 支持 | 不支持 |
1.配置文件yml还是properties都能获取到值;
2.如果在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
3.如果编写了一个javaBean来和配置文件进行映射,那么就用@ConfigurationProperties
四、@PropertySource
加载指定的配置文件:
五、@ImportResource(不推荐)
导入自己编写的Spring配置文件,让配置文件里面的内容生效;
5.1SpringBoot推荐给容器中添加组件的方式
写一个配置类,使用@Bean
六、配置文件占位符
随机数、获取之前配置的值
七、Profile文件
7.1.多个Profile文件
7.1.1编写多个配置文件
文件名可以是: application-{profile}.properties/yml
7.1.2使用yml
使用问文档块
7.2激活指定profile
7.2.1配置文件
spring.profiles.active=prod
7.2.2命令行
--spring.profiles.active = dev
7.2.3jvm参数
-Dspring.profiles.active = dex
八、配置文件加载位置
springBoot启动会扫描一下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件
- file(项目):/config/
- file(项目):/
- classpath(resources): /config/
- classpath(resources):/
以上按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置的内容。
可以通过spring.config.location来改变默认配置:互补配置
九、自动配置原理
9.1.SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration
9.2.@EnableAutoConfiguration作用:
-利用 AutoConfigurationImportSelector给容器中导入一些组件;
-List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置
--SpringFactoriesLoader.loadFactoryNames()
--扫描所有的jar包类路径下 META-INF/spring.factories
--把扫描到的这些文件的内容封装成properties对象
--从properties中获取到EnableAutoConfiguration.class类对应的值,然后把他们添加到容器中
将 类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到容器中
9.3.以HttpEncodingAutoConfiguration为例解释自动配置原理:
@Configuration
//表示这是一个配置类
@EnableConfigurationProperties({HttpProperties.class})
//启动指定类的ConfigurationProperties功能,将配置文件中对应的值和HttpProperties绑定起来
//并把HttpProperties加入到容器中
@ConditionalOnWebApplication(
type = Type.SERVLET
)
//Spring底层的@Controller注解,根据不同条件。
//如果满足条件呢,整个配置类里面的配置就会生效;
//判断当前应用是否是web应用,如果是,当前配置生效
@ConditionalOnClass({CharacterEncodingFilter.class})
//判断当前项目有没有这个类
//CharacterEncodingFilter:springmvc中进行乱码解决的过滤器
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
//判断配置文件中是否存在某个配置
public class HttpEncodingAutoConfiguration {
-----@Conditional扩展注解------ | ------作用(判断是否满足当前指定条件)---- |
@ConditionalOnJava | 系统点的java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定Bean |
@ConditionalOnMissingBean | 容器中不存在指定Bean |
@ConditionalOnExpression | 满足SpEl表达式指定 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定的资源文件 |
@ConditionalOnWebApplication | 当前是web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | JNDI存在指定项 |
9.4debug报告
配置:
哪些类已经自动配置
哪些类没有自动配置?