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

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

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

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

thx

阅读 2.4k
评论 更新于 2018-07-22
    4 个回答

    有的,你需要几个注解,对应的配置类型的变量提升为一个类的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;
        }
    
    }
    评论 赞赏 2018-07-22
      loong
      • 491

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

      评论 赞赏 2018-07-23

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

            @Bean
            @ConfigurationProperties("spring.datasource.druid")
            public DataSource dataSource() {
                return new DruidDataSource();
            }
        评论 赞赏 2018-07-23

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

          评论 赞赏 2019-10-08
            撰写回答

            登录后参与交流、获取后续更新提醒