Author:SimpleWu
properteis 文件属性参考大全
springboot 默认加载配置
SpringBoot 使用两种全局的配置文件, 全局配置文件可以对一些默认配置进行修改.
application.properties
application.YAML
这两个配置文件使我们 springboot 启动的时候回默认加载的配置文件.
配置文件放在 src/main/resources 目录或者类路径 / config 下, 这个配置文件的路径是有优先级的, 至于优先级后面再说.
首先这两个文件中 properties 这个文件不需要多说使我们经常使用的资源文件, 可是这个 YAML 是什么呢? 后面再说
配置信息
SpringBoot 不需要添加复杂的 web.xml 或者 spring.xml 等配置文件, spring 只有一个配置文件, 也非必须的.
默认的配置文件是 application.properties.
- # 修改端口号
- server.port=8888
- # 定义项目的访问目录
- server.context-path=/springboot
我们使用 IDEA 需要注意, 图就不截图太麻烦了:
如果 properties 文件中出现乱码, 找到 setting 中, 在 file encoding 中勾选 Transparent native-to-asci conversion.
YAML 文件
除了默认的 properties 文件, SpringBoot 还提供另外一种配置文件 YAML, 这种文件提供一种更加简洁的方式编写配置信息.
YAML 是 YAML(YAML Ain't Markup Language) 语言的文件, 是一种标记语言, 以数据为中心, 比 JSON,xml 等更适合做配置文件, 有想法的可以去网上搜搜资料学习下.
参考语法规范:
官方参考: http://www.yaml.org
YAML 学习参考: https://www.yiibai.com/yaml/yaml_syntax_primitives.html
YAML 基本语法:
以键值对的方式表示属性.(空格必须有).
使用缩进表示层级关系
缩进时不允许使用 Tab 键, 只允许使用空格.
缩进的空格数目不重要, 只要相同层级的元素左侧对齐即可.
属性和值是大小写敏感的.
例子:
- server:
- port: 8081
- servlet:
- context-path: springboot
注意:[: 后必须跟一个空格] , 两种方式推荐使用 YAML 方式配置项目.
YAML 语法
YAML 支持的三种数据结构.
字面量: 普通的值.(数字, 字符串, 布尔)
对象: 键值对的集合.(Map)
数组: 一组按次序排列的值.(List,Set)
字面量
YAML 中字面量属于普通的值. 以 key: value 来表示, value 前必须带一个空格.
字面量, 字符串默认不需要单双引号.
双引号: 会转义字符, 特殊字符会被转义.(name: "SimpleWu\n lisi" // 输出: SimpleWu 换行 lisi)
单引号: 不会转义字符, 特殊字符不会被转义.(name: 'SimpleWu\n lisi' // 输出: SimpleWu\n lisi)
- server:
- port: 8081
对象, Map
在 YAML 中, 对象和 Map 都是以键值对的方式表示. 在下一行来编写属性和值得关系, 注意缩进.
- users:
- firstName: SimpleWu
- email: lovelyWu98k@gmail.com
对象还有另一种写法, 看到这种写法是不是想到了 JSON?
- users: {
- firstName: zhangsan,
- email: lovelyWu98k@gmail.com
- }
数组
用 - 值得方式来表示数组中的一个元素.
- users:
- - SimpleWu
- - lovelyWu98k@gmail.com
- - addressisnot
另外一种写法, 还是像 JSON
users: [SimpleWu,lovelyWu98k@gmail.com,addressisnot]
将配置映射到实体类
springboot 支持我们直接将 properties 或者 YAML 中的属性映射到某个实体类, 看例子.
- MySQL:
- url: jdbc:MySQL:///springboot
- port: 3306
- user: root
- pass: root
假如在资源中我们现在有个 MySQL 的链接信息, 我们如何将它映射到实体类中去呢?
有两种方式:
@ConfigurationProperties 指定从配置文件中读取属性, prefix 指定对应 YAML 文件中的名称.
@Value 获取配置的属性值
@ConfigurationProperties
使用 IDEA 当我们添加了 @ConfigurationProperties 注解后, 在页面上回出现一个错误提示, 我们需要加入依赖.
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-configuration-processor</artifactId>
- <optional>true</optional>
- </dependency>
编写 JAVA 类 MySQLInfo.java
- //java 类
- @ConfigurationProperties(prefix = "mysql")
- @Component
- public class MySQLInfo {
- private String url;
- private Integer port;
- private String user;
- private String pass;
- // 省略 getset
- }
我们只需要指定 prefix 即可, 他就会加载我们 YAML 配置前置为 MySQL 的属性.
@Value
如果我们使用这个注解来获取属性使用方式是:
- //java 类
- @Component
- public class MySQLInfo {
- @Value("${mysql.url}")
- private String url;
- @Value("${mysql.port}")
- private Integer port;
- @Value("${mysql.user}")
- private String user;
- @Value("${mysql.pass}")
- private String pass;
- // 省略 getset
- }
注意如果需要使用表达式只有 @Value 才可以,@Value("#{10*2}) 结果为: 20
两种方式的区别:
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定 | 支持 | 属性名必须完全匹配 |
SPEL 表达式 | 不支持 | 支持 |
JSR303 效验 | 支持 | 不支持 |
复杂类型 | 支持 | 不支持 |
两种方式的适用场合:
当只需要为某个值提供注入时, 推荐使用 @Value 方式.
当需要对整个对象的整体进行赋值时, 使用 @ConfigurationProperties.
加载外部配置文件
如果我们将所有的配置信息都写在 application.YAML 文件中, 则到时候 YAML 文件会变得非常庞大, 不太方便我们进行维护.
我们可以对配置中的内容进行拆分, 拆分到多个文件中. 这样就提高了配置的可维护性.
引入外部配置文件:
- @PropertySource(value={
- "classpath:student.properties"
- })
- @ImportResource(locations={
- "classpath:spring.xml"
- }
@Configuration 和 @Bean 方式.(SpringBoot 推荐方式)
第一种方式:@ProperSource 方式: 需要注入的类的前面使用该注解.
第二种方式:@ImportResource 方式首先添加一个 spring 的配置文件, 在里面添加需要映射的类. 在启动的 SpringBootApplication 前面使用该注解
第三种方式:@Configuration 和 @Bean 方式添加一个自定义配置类.
- // 第三种方式
- @Configuration
- public class MyConfig {
- // 将方法的返回值添加到容器中; 容器中这个组件默认的 id 就是方法名
- @Bean
- public MySQLInfo mySQLInfo(){
- System.out.println("配置类 @Bean 给容器中添加组件了...");
- return new MySQLInfo();
- }
- }
切换多个外部配置文件
真实环境中, 有时候需要配置多个配置文件, 可以使用 spring.profile.active 来进行切换.
比如现在我们有三个配置文件:
application.YAML
- application-dev.YAML
- application-prod.YAML
我们在 application.YAML 中通过 spring.profile.active = dev(prod) 来选择需要加装的配置文件.
或者我们可以通过 maven 将项目打成 jar 包通过命令行使用以下命令来指定环境
java -jar springboot02-0.0.1-SHAPSHOT.jar -spring.profiles.active=dev
文档块
在 YAML 文档中, 可以适用 --- 来将一个文档拆分为多个文档块. 可以在不同文档块中分别定义不同的环境.
然后通过 spring.profiles=xxx 来对文档块进行命名. 最后通过第一个文档块制定 spring.profiles.active=xxx 来指定到底激活哪个文档块.
- #application.YAML
- spring:
- profiles:
- active: dev #指定激活 dev 文档
- ---
- server:
- port: 8081
- spring:
- profiles: dev #给文档命名为 dev
配置文件加载位置和顺序
springboot 启动会扫描一下位置的配置文件作为 springboot 的默认配置文件.
项目路径下的 config 文件夹
项目路径下
classpath 路径下 config 文件夹
classpath 路径下
以上是按照优先级从高到低的顺序, 所有位置的文件都会被加载, 如果冲突的情况, 高优先级配置内容会覆盖低优先级配置内容. 如果不冲突, 形成互补配置.
我们也可以通过配置 spring.config.location 来改变默认配置. 使用命令行方式加载, 否则优先级不够.
java -jar xxxx.jar -spring.config.location = 配置文件路径
外部配置加载顺序
pringBoot 也可以从以下位置加载配置; 优先级从高到低, 高优先级的配置覆盖低优先级的配置, 所有配置形成互补配置.
命令行参数
来自 java:comp/env 的 JNDI 属性
Java 系统属性 (System.getProperties())
操作系统环境变量
RandomValuePropertySource 配置的 random.* 属性值
jar 包外部的 application-{profile}.properties 或 application.YAML(带 spring.profile) 配置文件
jar 包内部的 application-{profile}.properties 或 application.YAML(带 spring.profile) 配置文件
jar 包外部的 application.properties 或 application.YAML(不带 spring.profile) 配置文件
jar 包内部的 application.properties 或 application.YAML(不带 spring.profile) 配置文件
@Configuration 注解类上的 @PropertySource
通过 SpringApplication.setDefaultProperties 指定的默认属性
官方参考文档: https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config
springboot 自动配置
SpringBoot 启动会加载大量的自动配置类
我们看我们需要的功能有没有 SpringBoot 默认写好的自动配置类;
我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有, 我们就不需要再来配置了)
给容器中自动配置类添加组件的时候, 会从 properties 类中获取某些属性. 我们就可以在配置文件中指定这些属性的值;
自动配置原理: SpringBoot 启动的时候, 加载主配置类, 开启了自动配置功能 @EnableAutoConfiguration.
利用 EnableAutoConfigurationImportSelector 给容器中导入一些组件.
导入的文件在都配置在文件 META-INF/spring.factories 中的 EnableAutoConfiguration 属性来获取的. 每一个这样的 xxxAutoConfiguration 类都是容器中的一个组件, 都加入到容器中; 用他们来做自动配置.
每一个自动配置类进行自动配置功能;
根据当前不同的条件判断, 决定这个配置类是否生效?
这些组件的属性是从对应的 properties 类中获取的, 这些类里面的每一个属性又是和配置文件绑定的;
所有在配置文件中能配置的属性都是在 xxxxProperties 类中封装者'; 配置文件能配置什么就可以参照某个功能对应的这个属性类
来源: https://www.cnblogs.com/SimpleWu/p/10032923.html