SpringBoot在yml中自定义复杂配置
由于业务需要,需要我们在yml配置中自定义自己的配置。
但是我们的配置有时候需要是一个String集合,或者是一个对象集合,那么此时应该如何在yml中进行配置和在代码中进行读取呢。
看下面的demo
wechat:
url:
unifiedorder: https://api.mch.weixin.qq.com/pay/unifiedorder
unifiedorder-callback: 支付回调地址,需要是https的域名才行
apps:
- appid: 自己的appid1
mch_id: 自己的mchid
app_secret: 账户对应的acc_secret
trade_type: APP, JSAPI
cert: p12证书存放地址
sign_type: MD5
- appid: 自己的appid2
mch_id: 自己的mchid
app_secret: 账户对应的acc_secret
trade_type: APP, JSAPI
cert: p12证书存放地址
sign_type: MD5
@Data
@Component
// 配置名称的统一前缀
@ConfigurationProperties(prefix = "wechat")
public class WechatConfig {
@Value("${wechat.url.unifiedorder}")
private String unifiedOrderUrl;
@Value("${wechat.url.unifiedorder-callback}")
private String unifiedOrderCallbackUrl;
private List<WechatAppConfig> apps;
// 将多个微信账户的配置转为Map<String, WechatAppConfig>对象
// key: appId
// val: WechatAppConfig对象
// 哪里需要的时候,注入该bean即可使用
@Bean(name = "WechatApps")
public Map<String, WechatAppConfig> getWechatAppConfigMap () {
Map<String, WechatAppConfig> map = new HashMap<>();
for (WechatAppConfig app : apps) {
map.put(app.getAppid(), app);
}
return map;
}
}
@Data
public class WechatAppConfig {
private String appid;
private String mchId;
private String appSecret;
private String cert;
// 配置中trade_type字段要用","分割
private List<String> tradeType;
private String signType;
}
@Service
@Slf4j
public class WechatService {
@Autowired
private WechatConfig wechatConfig;
@Autowired
private Map<String, WechatAppConfig> wechatApps;
}
此时,即可在代码中直接使用自己注入的多种配置了。