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直接注入,需要通过配置类去接收

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);
 
}
 
}
 

你可能感兴趣的:(Spring)