springboot之yaml文件的配置与读取

一、yaml中的不同类型数据的写法

支持声明map, 数组,list,字符串,bool值,数值,NULL,日期,基本满足开发过程中的所有配置

1.1、字符串数字:

# 报文版本号,固定5.1.0,请勿改动

version: '5.1.0'

# 签名方式,证书方式固定01,请勿改动

signMethod: '01'

1.2、单个数组:(以- 开头的,就是代表着数组)

方式一:

card-expire-notify:

  templateIds: [95,96,97,98,99,100]

方式二:

card-expire-notify:

  templateIds:

   - 95

   - 96

   - 97

   - 98

   - 99

   - 100

读取方法:

@Configuration

@ConfigurationProperties(prefix = "card-expire-notify")

@Data

public class NotifyConfig {

    private String getActivityCardUrl;

    private String wechatTemplateId;

    private String accessToken;

    private List templateIds;

}

注意:yaml中的数组,map,list 只能用对象去接收(反射设值),不能用@Value直接注入,需要通过配置类去接收

springboot之yaml文件的配置与读取_第1张图片

1.3、对象数组

umsPay:

  msgSrc: ccccccc

  msgSrcId: 6788

  businessTypes:

    - type: qrCode

      instMid: yuiuiyiuiy

      msgType: bills.getQRCode

      payUrl:

      notifyUrl: ${server.host}ums/v0/api/qr-code/call-back

      returnUrl:

    - type: h5AliPay

      instMid: yiyuiyi

      msgType: trade.h5Pay

      payUrl: ${umsPay.ums-host}netpay-portal/webpay/pay.do

      notifyUrl: ${server.host}ums/v0/api/wap/call-back

      returnUrl: ${server.host}pay/success/

    - type: wxPublic

      instMid: tyfthhfh

      msgType: WXPay.jsPay

      payUrl: ${umsPay.ums-host}netpay-portal/webpay/pay.do

      notifyUrl: ${server.host}ums/v0/api/wap/call-back

      returnUrl: ${server.host}pay/success/

读取方法:

@Component

@ConfigurationProperties(prefix = "umsPay")

@Data

public class PayConfig {

    /**

     * 消息来源编号

     */

    private String msgSrcId;

    /**

     * 消息来源

     */

    private String msgSrc;

    /**

     * 终端号

     */

    private String tid;

    /**

     * 加密私钥

     */

    private String privateKey;

    /**

     * 业务类型

     */

   ** private List businessTypes = new ArrayList<>();**

}

二、应用中对yaml配置文件的读取方法

2.1、应用配置文件--属性配置文件的位置

spring会从classpath下的/config目录或者classpath的根目录查找application.properties或application.yml。

/config优先于classpath根目录

@PropertySource

这个注解可以指定具体的属性配置文件,优先级比较低。

SpringApplication.setDefaultProperties

例如:

SpringApplication application = new SpringApplication(Application.class);

Map defaultMap = new HashMap();

defaultMap.put("name", "Isea-Blog");

//还可以是Properties对象

application.setDefaultProperties(defaultMap);

application.run(args);

2.2、应用(使用)属性

2.2.1、@Value(“${xxx}”)

这种方式是最简单的,通过@Value注解可以将属性值注入进来。

yaml:

xxl:

  job:

    accessToken:

    admin:

      addresses: http://10.0.0.26:30104/

    executor:

      appname: carowner-common-set-meal-notify

      ip:

      port: 9999

      logretentiondays: -1

      logpath: /data/logs/lms-dmp-service/xxl-job/jobhandler

配置类:

@Component

@Configuration

public class XxlJobConfig {

    @Value("${xxl.job.admin.addresses}")

    private String adminAddresses;

    @Value("${xxl.job.executor.appname}")

    private String appName;

    @Value("${xxl.job.executor.ip}")

    private String ip;

    @Value("${xxl.job.executor.port}")

    private int port;

    @Value("${xxl.job.accessToken}")

    private String accessToken;

    @Value("${xxl.job.executor.logpath}")

    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")

    private int logRetentionDays;

}

2.2.2、@ConfigurationProperties

Spring boot 应用中,当使用注解方式定义一个Bean时,同时可以利用@ConfigurationProperties导入外部属性填充到这个Bean的实例。本文通过例子介绍了几种用法可以达到这种效果 :

方式1 : @ConfigurationProperties + @Component 注解到bean定义类上

方式2 : @ConfigurationProperties + @Bean注解在配置类的bean定义方法上

方式3 : @ConfigurationProperties注解到普通类然后通过@EnableConfigurationProperties定义为bean

方式1 : @ConfigurationProperties + @Component 注解到bean定义类上

类定义为Bean

// 将类定义为一个bean的注解,比如 @Component,@Service,@Controller,@Repository

// 或者 @Configuration

@Component

// 表示使用配置文件中前缀为 section1 的属性的值初始化该bean定义产生的的bean实例的同名属性

// 在使用时这个定义产生的bean时,其属性 name 会是 Tom

@ConfigurationProperties(prefix = "section1")

public class Bean1 {

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

private String name;

}

方式2 : @ConfigurationProperties + @Bean注解在配置类的bean定义方法上

Bean来自一个普通类

// 这是一个一般java类,POJO,没有任何注解

public class Bean2 {

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

private String name;

}

使用@Bean注解将一个配置类的方法定义为一个bean

在项目的某个@Configuration配置类中通过@Bean注解在某个方法上将上面的POJO类定义为一个bean,并使用配置文件中相应的属性初始化该bean的属性。

这里所说的@Configuration配置类可以是直接通过@Configuration注解的配置类,也可以是隐含使用了@Configuration注解的类,比如下面的例子中,@SpringBootApplication隐含了@Configuration。

// 声明为Spring boot 应用,隐含了注解@Configuration

@SpringBootApplication

public class Application {

    // @Bean 注解在该方法上定义一个bean,这种基于方法的Bean定义不一定非要出现在

    // @SpringBootApplication 注解的类中,而是出现在任何@Configuration注解了

    // 的类中都可以

@Bean

// 使用配置文件中前缀为section2的属性的值初始化这里bean定义所产生的bean实例的同名属性,

// 在使用时这个定义产生的bean时,其属性 name 会是 Jerry

@ConfigurationProperties(prefix = "section2")

public Bean2 bean2() {

     // 注意,这里的 Bean2 是上面所示的一个POJO类,没有任何注解

return new Bean2();

}

public static void main(String[] args) throws Exception {

SpringApplication.run(Application.class, args);

}

}

方式3 : @ConfigurationProperties注解到普通类然后通过@EnableConfigurationProperties定义为bean

注解一个普通类的属性将会来自外部属性文件

// 该注解声明如果该类被定义为一个bean,则对应的bean实例的属性值将来自配置文件中前缀为

// section3的同名属性。但是这个注解本身并不会导致该类被作为一个bean注册

@ConfigurationProperties(prefix = "section3")

public class Bean3 {

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

private String name;

}

使用@EnableConfigurationProperties将上述类定义为一个bean

@SpringBootApplication

// 该注解会将类Bean3作为一个bean定义注册到bean容器,而类Bean3上的注解

// @ConfigurationProperties(prefix = "section3")会导致目标bean

// 实例的属性值使用配置文件中前缀为section3的同名属性值来填充,也就是目标

// bean的属性name的值会是Dog

@EnableConfigurationProperties({Bean3.class})

public class Application {

public static void main(String[] args) throws Exception {

SpringApplication.run(Application.class, args);

}

}

 

你可能感兴趣的:(Java,Springboot)