spring boot 之配置文件yarm读取04

1.springboot 读取配置文件yarn

1.1 准备配置文件yaml

在main目录下新建resources目录,并设置为Root Resources,新建文件application.yaml

server:
 ip: 10.1.0.6
 hostname: hadoop-bd1
 admin: zhangsan

yaml是替代传统的xx.properties文件,是一种方便的定义层次配置数据的格式

1.2 创建配置类,通过@Value来注入值

1.2.1 @Value(“xxx”)直接指定值

package com.mp.prj.domain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Server01 {

    @Value("10.1.0.1")
    private String ip;
    @Value("hadoop-bd1")
    private String hostname;
    @Value("1")
    private int admin;


    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public int getAdmin() {
        return admin;
    }

    public void setAdmin(int admin) {
        this.admin = admin;
    }

    @Override
    public String toString() {
        return "Server01{" +
                "ip='" + ip + '\'' +
                ", hostname='" + hostname + '\'' +
                ", admin=" + admin +
                '}';
    }
}

使用@SpringBootTest 单元测试

package com.mp.test;

import com.mp.prj.AppTest;
import com.mp.prj.domain.Server01;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/*
* @SpringBootTest:用于springboot项目微服务单元测试,需要指定classes 启动类
@RunWith :需要指定
* */

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AppTest.class)
public class IocTest02 {

    @Autowired
    Server01 server01;

    @Test
    public void test02(){
        System.out.println(server01);
    }
}

运行结果:

Server01{ip='10.1.0.1', hostname='hadoop-bd1', admin=1}

1.2.2 @value("#{1+2}") 通过SPel表达式

package com.mp.prj.domain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Server02 {

    private String ip;
    private String hostname;
    @Value("#{1+0}")
    private int admin;


    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public int getAdmin() {
        return admin;
    }

    public void setAdmin(int admin) {
        this.admin = admin;
    }

    @Override
    public String toString() {
        return "Server01{" +
                "ip='" + ip + '\'' +
                ", hostname='" + hostname + '\'' +
                ", admin=" + admin +
                '}';
    }
}

同样单元测试,也是可以捕获到信息

1.2.3 @value("${xx.xxxx}") 从配置文件中读取

package com.mp.prj.domain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

/*
* 这里使用@Configuration 注解,作用于类上,表明这个类为一个配置类,其实里面也包含有@Component注解
* */
@Configuration
public class Server03 {
    @Value("${server.ip}")
    private String ip;
    @Value("${server.hostname}")
    private String hostname;
    @Value("${server.admin}")
    private int admin;


    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public int getAdmin() {
        return admin;
    }

    public void setAdmin(int admin) {
        this.admin = admin;
    }

    @Override
    public String toString() {
        return "Server01{" +
                "ip='" + ip + '\'' +
                ", hostname='" + hostname + '\'' +
                ", admin=" + admin +
                '}';
    }
}

测试运行结果:

Server01{ip='10.1.0.6', hostname='hadoop-bd1', admin=1}

1.2.4 针对1.2.3从配置文件中读取,简化版

(1)针对属性值很多的情况下,我们每一个属性都要去写@Value 配置,那岂不是很麻烦,所以我们这里可以指定配置前缀
(2)通过@ConfigurationProperties 我们取指定配置文件的前缀
(3)字段名默认和配置文件中处前缀后一致的情况下,是可以省略掉@Value注解的

package com.mp.prj.domain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/*
* 这里使用@Configuration 注解,作用于类上,表明这个类为一个配置类,其实里面也包含有@Component注解
* */
@Configuration
@ConfigurationProperties(prefix = "server")  //指定配置文件的前缀
public class Server04 {
    private String ip;
    private String hostname;
    private int admin;


    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public int getAdmin() {
        return admin;
    }

    public void setAdmin(int admin) {
        this.admin = admin;
    }

    @Override
    public String toString() {
        return "Server01{" +
                "ip='" + ip + '\'' +
                ", hostname='" + hostname + '\'' +
                ", admin=" + admin +
                '}';
    }
}

同样,我们是可以得到结果的

2.多环境Yaml配置文件

(1)很多情况下,我们会将开发和生成环境等多种配置放在一个yaml配置文件中,要求支持多环境切换
(2)通过spring.profiles 来指定该文档应用于哪个环境
(3) 配置文件中使用— 分割配置文件

2.1 使用spring.profiles.active 环境属性来指定哪些配置文件处于活动状态

spring:
 profiles:
   active: pro
---
spring:
 profiles: dev
server:
 ip: 10.1.0.6
 hostname: hadoop-bd1
 admin: 1
---
spring:
 profiles: pro
server:
 ip: 192.168.1.128
 hostname: hadoop-bd100
 admin: 0

2.2 以编程方式启动配置文件

@SpringBootApplication
public class DemoApplication {
   public static void main(String[] args) {
       SpringApplication app = new SpringApplication(DemoApplication.class);
       //启动dev配置文件
       app.setAdditionalProfiles("dev");   // dev 或prod
       app.run(args);
   }
}

你可能感兴趣的:(springboot学习笔记)