(二)Spring Boot配置

1、配置文件

Spring Boot使用一个全局的配置文件,额皮质文件名是固定的;

  • application.properties
  • application.yml

配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

YAML(YAML Ain't Markup Language)

  YAML A Markup Language:是一个标记语言

  YAML isn't Markup Language:不是一个标记语言;

标记语言:

  以前的配置文件;大多使用的是 xxx.xml文件;

  YAML: yml是YAML(YAML Ain't Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件,http://www.yaml.org/参考语法规范

  YAML:配置示例

1 server:
2   port: 8081

  XML:

1 <server>
2     <port>8081</port>
3 </server>

配置文件放在src/main/resources目录或者类路径/config下

全局配置文件的可以对一些默认配置值进行修改

2、YAML语法

1.基本语法

  k:(空格)v:表示一对键值对(空格必须有);

  以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

server:
    port: 8081
    path: /hello

  属性和值也是大小写敏感;

2.值的写法

  字面量:普通的值(数字,字符串,布尔)

    k:(空格)v:字面直接来写;

      字符串默认不用加上单引号或者双引号

      "":双引号;不会转义字符里面的特殊字符串;特殊字符会作为本身想表示的意思

        name: "zhangsan \n lisi";输出:zhangsan 换行 lisi

      '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

        name: "zhangsan \n lisi";输出:zhangsan \n lisi

  对象(属性和值)(键值对);

    k: v:在下一行来写对象的属性和值的关系;注意缩进

      对象还是k: v的方式

      

1 friends:
2   lastName: zhangsan
3   age: 20

    行内写法:

1 friends: {lastName: zhangsan,age: 18}

  数组(List,Set)

  用- 值标书数组中的一个元素

1 pets:
2  - cat
3  - dog
4  - pig

  行内写法

pets: [cat,pig,dog]

3.配置文件值注入

配置文件

 1 person:
 2   lastName: zhangsan
 3   age: 18
 4   boss: false
 5   birth: 2017/12/12
 6   maps: {k1: v1,k2: 12}
 7   lists:
 8    - lisi
 9    - zhaoliu
10   dog:
11    name: 小狗
12    age: 2

javaBean:

 1 /**
 2  * 将配置文件中配置的每一个属性的值,映射到这个组件中
 3  *
 4  * @ConfigurationProperties: 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 5  *  prefix = "person" :配置文件中哪个下面的所有属性进行一一映射
 6  *
 7  * 只有这个组件是容器中的组件,才能提供的@ConfigurationProperties功能
 8  */
 9 @Component
10 @ConfigurationProperties(prefix = "person")
11 public class Person {
12 
13     private String lastName;
14     private Integer age;
15     private Boolean boss;
16     private Date birth;
17 
18     private Map<String, Object> maps;
19     private List<Object> lists;
20     private Dog dog;

我们可以导入配置文件处理器,以后编写配置就有提示了

1 <!-- 导入配置文件处理器,配置文件进行绑定就会有提示-->
2 <dependency>
3     <groupId>org.springframework.boot</groupId>
4     <artifactId>spring-boot-configuration-processor</artifactId>
5     <optional>true</optional>
6 </dependency>            

properties配置文件在idea中默认utf-8可能会乱码

@Value获取值和@ConfigurationProperties比较

  @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBen来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

@PropertySource&@ImportResource

  @PropertySource: 加载指定的配置文件

 1 /**
 2  * 将配置文件中配置的每一个属性的值,映射到这个组件中
 3  *
 4  * @ConfigurationProperties: 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 5  *  prefix = "person" :配置文件中哪个下面的所有属性进行一一映射
 6  *
 7  * 只有这个组件是容器中的组件,才能提供的@ConfigurationProperties功能
 8  * @ConfigurationProperties(prefix = "person")默认从全局配置文件中取值
 9  */
10 @PropertySource(value = {"classpath:person.properties"})
11 @Component
12 @ConfigurationProperties(prefix = "person")
13 //@Validated
14 public class Person {
15 
16     /**
17      * <bean class="Person">
18      *  <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEl}"></property>
19      * </bean>
20      */
21 
22     //lastName必须是邮箱格式
23     //@Email
24     //@Value("${person.last-name}")
25     private String lastName;
26     //@Value("#{11*2}")
27     private Integer age;
28     //@Value("true")
29     private Boolean boss;
30     private Date birth;
31 
32     private Map<String, Object> maps;
33     private List<Object> lists;
34     private Dog dog;

  @ImportResource: 导入Spring的配置文件,让配置文件里面的内容生效;

  Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

  不来编写Spring的配置文件

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5 
6     <bean id="helloService" class="com.young.springboot.service.HelloService"></bean>
7 
8 </beans>

  想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

1 @ImportResource(locations = {"classpath:beans.xml"})
2 导入Spring的配置文件让其生效

  SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式

  1.配置类=====Spring配置文件

  2.使用@Bean给容器中添加组件

 1 /**
 2  * @Configuration: 指明当前类是一个配置类;就是来替代之前的Spring配置文件
 3  *
 4  * 在配置文件中<bean></bean>标签添加组件
 5  */
 6 @Configuration
 7 public class MyAppConfig {
 8 
 9     //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
10     @Bean
11     public HelloService helloService(){
12         System.out.println("配置类@Bean给容器中添加组件了...");
13         return new HelloService();
14     }
15 
16 }

  配置文件占位符

  1.随机数

1 ${random.value}、${random.int}、${random.long}
2 ${random.int(10)}、${random.int[1024,65536]}

  2.占位符获取之前配置的值,如果没有可以是用:指定默认值

1 person.last-name=张三${random.uuid}
2 person.age=${random.int}
3 person.birth=2017/12/15
4 person.boss=false
5 person.maps.k1=v1
6 person.maps.k2=v2
7 person.lists=a,b,c
8 person.dog.name=${person.hello:hello}_dog
9 person.dog.age=15

Profile

  1.多Profile文件

  我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml

  默认使用application.properties的配置;

  2.yml支持多文档块方式

 1 server:
 2   port: 8081
 3 spring:
 4   profiles:
 5     active: prod
 6 ---
 7 server:
 8   port: 8083
 9 spring:
10   profiles: dev
11 ---
12 server:
13   port: 8084
14 spring:
15   profiles: prod #指定属于哪个环境

  3.激活指定profile

    a.在配置文件中指定 spring.profiles.active=dev

    b.命令行:

     java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;可以直接在测试的时候;配置传入命令行参数

    c.虚拟机参数:

      -Dspring.profile.active=dev

配置文件加载位置

springboot启动会扫描以下位置的application.proprties或者application.yml文件作为Spring Boot的默认配置文件

- file:../config/

- file:./

- classpath:/config/

- classpath:/

优先级由高到低,高优先级的配置会覆盖低优先级的配置

SpringBoot会从四个位置全部加载主配置文件;互补配置;

我们还可以通过spring.config.location来改变默认的配置文件位置

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的这些配置文件共同其作用形成互补配置

猜你喜欢

转载自www.cnblogs.com/yang-young-young/p/9266010.html