spring boot 多配置文件加载,统一加载

发布于 2022-09-07 19:35:14 字数 326 浏览 21 评论 0

准备从spring mvc 迁移到spring-boot 技术栈,有个关于多配置文件的疑惑,在看的过程中发现spring boot 的配置是个很大的优点,但是并没有真正体会到其中的优点。

假如有多个(>6)个properties文件,大都是关于一些上下游地址的配置,数据库配置,以及一些默认变量。但是看spring-boot 需要对每个配置文件有个配置类,然后在里面声明配置变量,然后使用@Value注解使用。

问题:
有没有一个更好的方式,能够统一对所有的配置文件变量,加载都spring 容器里面,直接使用,不需要写多个配置bean?

thx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

沉鱼一梦 2022-09-14 19:35:14

有的,你需要几个注解,对应的配置类型的变量提升为一个类的Config,如下

@Data
@Component
@ConfigurationProperties(prefix = "wechat")
public class WechatAccountConfig {

    /**
     * 公众平台Id
     */
    private String mpAppId;

    /**
     * 公众平台密钥
     */
    private String mpAppSecret;

    /**
     * 开发平台Id
     */
    private String openAppId;

    /**
     * 开发平台密钥
     */
    private String openAppSecret;

    /**
     * 商户号
     */
    private String mchId;

    /**
     * 商户号密码
     */
    private String mchKey;

    /**
     * 证书路径
     */
    private String keyPath;

    /**
     * 微信支付异步通知地址
     */
    private String notifyUrl;

    /**
     * 微信模板Id
     */
    private Map<String, String> templateId;
}

@Data是快速getter和setter,@Component注解Wie组件,另一个是配置其前缀
之后你仅需要在yml文件配置后就行

wechat:
  mpAppId: xxxx
  mpAppSecret: xxxx
  openAppId: xxxx
  openAppSecret: xxx
  mchId: xxx
  mchKey: xxx
  keyPath: /xx/xx/xx
  notifyUrl: http://xxxx.com/sb/pay/notify
  templateId:
    orderStatus: xxx

之后你在对应的主要配置类调用get属性就行

@Component
public class WechatMpConfig {

    @Autowired
    private WechatAccountConfig wechatAccountConfig;

    @Bean
    public WxMpService wxMpService(){
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }

    @Bean
    public WxMpConfigStorage wxMpConfigStorage(){
        WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
        wxMpConfigStorage.setAppId(wechatAccountConfig.getMpAppId());
        wxMpConfigStorage.setSecret(wechatAccountConfig.getMpAppSecret());
        return wxMpConfigStorage;
    }

}
没企图 2022-09-14 19:35:14

SpringBoot有个“约定大于配置”的特点,也就是说,很多必须的配置其实都是有默认的值(当然key也是默认的,比如server.port等),这些配置只需要你在配置文件里面写好,然后引用配置文件,不需要再另外配置类进行引入。还有一些是自定义的配置,比如你要配置个默认的系统角色system.role.default,这些自定义的配置就需要用配置类进行读取了。

深府石板幽径 2022-09-14 19:35:14

不使用配置bean也可以,首先实例化bean中要有get/set方法,然后在实例化bean时添加属性前缀,@ConfigurationProperties("spring.datasource")

    @Bean
    @ConfigurationProperties("spring.datasource.druid")
    public DataSource dataSource() {
        return new DruidDataSource();
    }
╭⌒浅淡时光〆 2022-09-14 19:35:14

你这种需求应该把配置分成多个profile, 然后在不同的环境激活相应的profile。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文