SpringBoot入门教程(二) Spring Boot配置第一章

一、配置文件

  SpringBoot使用一个全局的配置文件,配置文件名是固定的

  • application.properties
  • application.yml

  配置文件的作用:修改Spring Boot自动配置的默认值;Spring Boot在底层都给我们自动配置好;不满意可以修改

  YAML  ( YAML Ain't a Markup Language)

    YAML A  Markup Language :是一种标记语言;

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

  标记语言:

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

    YAML :以数据为中心,比json、xml等更适合做配置文件;

    YAML配置实例

server:
  port:8081

     XML

<server>
    <port>8081</port>
</server>

二、YAML语法

1、基本语法

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

  • 大小写敏感
  • 使用缩进表示层级关系 
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释
server:
  port: 8081
  path: /hello

2、值的写法

  (1)、字面量,纯量是最基本的,不可再分的值

  k: v:字面直接来写;

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

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

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

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

  包括:

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期

  使用一个例子来快速了解纯量的基本使用:

boolean: 
    - TRUE  #true,True都可以
    - FALSE  #false,False都可以
float:
    - 3.14
    - 6.8523015e+5  #可以使用科学计数法
int:
    - 123
    - 0b1010_0111_0100_1010_1110    #二进制表示
null:
    nodeName: 'node'
    parent: ~  #使用~表示null
string:
    - 哈哈
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行,每一行会被转化成一个空格
date:
    - 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

  (2)、对象(属性和值)(键值对)    

    对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。

  也可以使用 key:{key1: value1, key2: value2, ...}

  还可以使用缩进表示层级关系;

key: 
    child-key: value
    child-key2: value2

较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:

?  
    - complexkey1
    - complexkey2
:
    - complexvalue1
    - complexvalue2

  意思即对象的属性是一个数组 [complexkey1,complexkey2],对应的值也是一个数组 [complexvalue1,complexvalue2]

  (3)、数组(list.、set)

  以 - 开头的行表示构成一个数组:

- A
- B
- C

  YAML 支持多维数组,可以使用行内表示:

key: [value1, value2, ...]

  一个相对复杂的例子:

companies:
    -
        id: 1
        name: company1
        price: 200W
    -
        id: 2
        name: company2
        price: 500W

  意思是 companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。

  数组也可以使用流式(flow)的方式表示:

companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]

三、配置文件注入

  配置文件

person:
  lastname: zhangsan
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {"k1":v1,"k2":v2}
  lists:
    - lisi
    - wangwu
  dog:
    name: 小狗
    age: 2

  javabean

**
 * 将配置文件中配置的每一个属性值,映射到这个组件中
 * @ConfigurationProperties:告诉Spring Boot将本类中的所有属性和配置文件中相关的配置进行绑定;
 *          prefix = "person" :配置文件中哪个下面的属性进行一一映射
 *
 *  @Component :只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastname;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;

    private Dog dog;

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

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

1、@Value获取值和@ConfigurationProperties获取值比较

  ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持

支持

JSR303数据检验 支持

不支持

复杂类型封装 支持

不支持

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

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

  如果说,我们专门编写了一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties(@ConfigurationProperties默认在全局文件中获取值);

  

 2、Properties配置文件编码问题

 

3、配置文件注入值数据检验

  

/**
 * 将配置文件中配置的每一个属性值,映射到这个组件中
 * @ConfigurationProperties:告诉Spring Boot将本类中的所有属性和配置文件中相关的配置进行绑定;
 *          prefix = "person" :配置文件中哪个下面的属性进行一一映射
 *
 *  @Component :只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
 */
@Component
@ConfigurationProperties(prefix = "person")
@Validated  //验证注解
public class Person {
    /**
     *  @Value注解的作用跟bean一样
     * <bean class="Person">
     *     <property name="lastname" value="字面量/${key}从环境配置、配置文件中获取值/#{SpEL}"></property>
     * ></bean>
     */
    //LatName必须是邮箱格式
    @Email
//    @Value("${person.lastname}")
    private String lastname;
//    @Value("#{11*2}")
    private Integer age;
//    @Value("true")
    private Boolean boss;
    private Date birth;

4、@PropertySource   &&  @ImportResource

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

/**
 * 将配置文件中配置的每一个属性值,映射到这个组件中
 * @ConfigurationProperties:告诉Spring Boot将本类中的所有属性和配置文件中相关的配置进行绑定;
 *          prefix = "person" :配置文件中哪个下面的属性进行一一映射
 *
 *  @Component :只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
 */
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
    /**
     *  @Value注解的作用跟bean一样
     * <bean class="Person">
     *     <property name="lastname" value="字面量/${key}从环境配置、配置文件中获取值/#{SpEL}"></property>
     * ></bean>
     */
    //LatName必须是邮箱格式
//    @Email
//    @Value("${person.lastname}")
    private String lastname;
//    @Value("#{11*2}")
    private Integer age;
//    @Value("true")
    private Boolean boss;
    private Date birth;

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

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

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

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

  现在不来编写Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

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

  1、配置类(现在) ===== Spring的配置文件(之前)

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

四、配置文件的占位符

person.lastname=张三${random.value}
person.age=${random.int}
person.birth=2017/12/12
person.boss=false
person.maps.k1=v1
person.maps.k2=v2
person.lists=a,b,c
person.dog.name=${person.lastname}_dog
person.dog.age=2

五、Profile

  Profile是spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境

  1、多profile文件

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

    默认使用application.properties

  2、yml支持多文档块方式

server:
  port: 8081
spring:
  profiles:
    active: dev
---
server:
  port: 8082
spring:
  profiles: dev

---
server:
  port: 8083
spring:
  profiles: prod

  3、激活指定profile

    (1)在配置文件中指定  spring.profiles.active=dev

  (2)用命令行的方式启动

      --spring.profiles.active=dev

       第一种方式       可以在测试的时候,配置传入命令行参数

   

  第二种方式   java -jar springboot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

 

 

 

 

  (3)虚拟机参数

      -Dspring.profiles.active=dev

 

猜你喜欢

转载自www.cnblogs.com/Ge-Zsj/p/12602147.html