一、yaml中的不同类型数据的写法
支持声明map,数组,list,字符串,boolean值,数值,NULL,日期,基本满足开发过程中的所有配置。
1.字符串数字:
# 报文版本号,固定5.1.0,请勿改动
version: '5.1.0'
# 签名方式,证书方式固定01,请勿改动
signMethod: '01'
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直接注入,需要通过配置类去接收
对象数组:
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配置文件的读取方法
应用配置文件
属性配置文件的位置
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);
应用(使用)属性
一、@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;
}
二、@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);
}
}