SpringBoot(2)-------- SpringBoot配置文件application.yml文件配置详解

SpringBoot(2)配置文件

1    yml文件 和 properties文件的配置:

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

•application.properties
•application.yml

同样配置tomcat服务器的端口号,看一下配置方式的比较:
yml文件:
server:
  port: 8081
Spring中的XML文件:
<server>
    <port>8081</port>
</server>

2    yml文件的语法:
(1)基本语法:
key:(空格) 值  value:(空格) 值   -----》表示一对键值对(空格必须有);

在yml文件中以**空格**的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server:
    port: 8081
    path: /hello
属性和值也是大小写敏感;

(2)基本变量值的语法:
字符串默认不用加上单引号或者双引号;

        "":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
                name:   "zhangsan \n lisi":输出;zhangsan 换行  lisi

        '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
                name:   ‘zhangsan \n lisi’:输出;zhangsan \n  lisi
(3)对象、Map(属性和值)(键值对):

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

        对象还是k: v的方式
friends:
        lastName: zhangsan
        age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}

(4)数组(List、Set):

用- 值表示数组中的一个元素
pets:
    - cat
    - dog
    - pig

行内写法
pets: [cat,dog,pig]

3   yml文件中配置值得注入
首先yml文件中的配置:
person:
    name: zhangsan
    age: 18
    boos: false
    maps: {k1: 2, k2: q}
    dog:
       name: wangwang
       age: 2
 然后写需要写一个对应类与yml文件对应
package com.demo.springbootdemo02.ymlTest;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.Map;

/**
* @ConfigurationProperties(prefix = "person")告诉SpringBoot将本类中的相关配置与yml文件中的配置绑定
* 获取配置前缀person下的配置的一一配置。
* 并且获取的是全局配置的变量的值
*
* @Component组件 也就是这个组件只有是spring容器中的组件才能使用@ConfigurationProperties功能
*
* @PropertySource(value = {"classpath:person.properties"})获取的是person.properties这个配置文件下的配置信息
*/

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated                    //JSR303校验
public class person {

    /**
     * @Value的用法呢其实就是和spring中的下面的用法相同
     * <bean class = "person">
     *     <property name = "last-name" value = "字面值/${kry}从环境变量、配置文件中获取值/#{SpEL}"><property/>
     * <bean/>
     */

//    @Value("${person.name}")
    private String name;
//    @Value("#{11*2}")
    private Integer age;
//    @Value("True")
    private  boolean boss;


    private Map<String, Object> maps;
    private Dog dog;



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public boolean isBoss() {
        return boss;
    }

    public void setBoss(boolean boss) {
        this.boss = boss;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", maps=" + maps +
                ", dog=" + dog +
                '}';
    }
}

 配置类中对象的名称与yml文件中的一一对应

这个时候需要引入依赖,在pop.xml文件中添加
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>
其实就是导入了文件处理器,以后编写配置就有提示了

4  关于注解的解释问题:
(1)   @Value获取值和@ConfigurationProperties获取值比较

什么时候用呢? ------ 
 如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

(2)   @PropertySource&@ImportResource& @Configuration&@Bean

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

@PropertySource(value = {"classpath:person.properties"})

@Configuration 表明类为配置类

@Bean 给容器组添加组件
具体使用:
首先配置类
package com.demo.springbootdemo02.Config;

import com.demo.springbootdemo02.Service.helloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @Configuration指明这是一个配置类,代替的是之前的spring配置组件
* 在Spring组件中是使用<bean><bean/>标签添加到容器中的
*/
@Configuration
public class myConfig {

    /**
     *就是将方法的返回值添加到容器中,容器中这个组件默认的id是方法的名称
     * 就是这里的id = helloService;
     */
    @Bean
    public helloService helloService(){
        return new helloService();
    }
}

然后测试类,测试组件有没有被加入到IOC容器中

@Autowired
org.springframework.context.ApplicationContext ioc;

@Test
public void testHelloService(){
   boolean b = ioc.containsBean("helloService");
   System.out.println(b);
5 配置文件的占位符问题:
(1)随机产生
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}

(2)占位符获取之前配置的值,如果没有可以是用:指定默认值
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15


6   Profile指定即多配置文件的编写使用
 
(1) 多Profile文件

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

默认使用application.properties的配置;

(2)  yml支持多文档块方式

server:
  port: 8081
spring:
  profiles:
    active: prod

---
server:
  port: 8083
spring:
  profiles: dev

---
server:
  port: 8084
spring:
  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.profiles.active=dev



阅读更多
换一批

没有更多推荐了,返回首页