• 【工厂模式】-企业微信应用配置代码优化


    一.为什么要使用工厂模式去优化代码

      现有的企业微信应用中,多个配置的应用Id不同,不同的应用需要各种定制化的配置,例如在企业微信消息推送中,通常使用@ComfigurationProperties去读取配置文件中的配置,然后在不同的定时任务中使用@AutoWired去注入相关的配置类,这样有一个缺点,配置类和不同的定时任务耦合度太高了,多个应用的配置类不好管理,因此使用配置工厂去生产不同的配置,降低配置与定时任务之间的耦合,便于管理不同的配置;

    二.优化之前的代码

    @Data
    @Component
    @ConfigurationProperties(prefix = "wxapp1")
    public class WxApp1{
    
        /** 企业Id */
        private String corpid;
    
        /** 企业号密钥 */
        private String corpsecret;
    
        /** 企业应用的id */
        private Integer agentId;
    
        /** 消息推送url */
        private String sendMessageUrl;
    }
    @Data
    @Component
    @ConfigurationProperties(prefix = "wxapp2")
    public class WxApp2{
    
        /** 企业Id */
        private String corpid;
    
        /** 企业号密钥 */
        private String corpsecret;
    
        /** 企业应用的id */
        private Integer agentId;
    
        /** 消息推送url */
        private String sendMessageUrl;
    }

    消息推送相关

    @Slf4j
    @Component
    public class WxMessageTask {
    
        @Autowired
        private WxApp1 app1;
    
        @Scheduled(cron = "0 0 10 1/1 * ?")
        public void pushMessage(){
            app1.xxx
            .....
            .....
        }    

    三.优化之后的代码

    企业微信应用枚举类

    @Getter
    @AllArgsConstructor
    public enum WxAppEnum {
    
        CORP_DAILY(1,"应用1"),
    
        WG_DATA(2,"应用2");
    
        /** 企业微信代码 */
        private int code;
        /** 企业微信应用 */
        private String wxAppName;
    }

    企业微信配置枚举 configName为Spring注入的bean的名称

    @Getter
    @AllArgsConstructor
    public enum  WxAppConfigEnum {
    
        WG_DATA_CONFIG(WxAppEnum.WG_DATA,"wgDataWechatConfig"),
        CORP_DAILY_CONFIG(WxAppEnum.CORP_DAILY,"corpWechatConfig");
    
        private WxAppEnum wxAppEnum;
        private String configName;
    
        /**
         * 获取微信应用配置枚举
         * @param valueName
         * @return
         */
        public static WxAppConfigEnum valueOfConfigName(String valueName){
            return Stream.of(values()).filter(x->x.getConfigName().equals(valueName))
                    .findFirst()
                    .orElse(null);
        }
    
        /**
         * 获取微信应用枚举
         * @param valueName
         * @return
         */
        public static WxAppEnum getWxAppEnum(String valueName){
            Optional<WxAppConfigEnum> optional = Optional.ofNullable(valueOfConfigName(valueName));
            return optional.isPresent()?optional.get().getWxAppEnum():null;
        }
    }

    配置工厂

    @Data
    @Component
    public class WxAppConfigFactory {
    
        public static final Map<WxAppEnum,IWxAppBaseConfig> configMap =new HashMap<>();
    
        @Autowired
        private ApplicationContext applicationContext;
    
        /**
         * 初始化微信应用配置
         */
        @PostConstruct
        public void init(){
            applicationContext.getBeansOfType(IWxAppBaseConfig.class)
                    .entrySet()
                    .stream()
                    .filter(x-> !ObjectUtil.isNull(WxAppConfigEnum.valueOfConfigName(x.getKey())))
                    .forEach(x->configMap.put(WxAppConfigEnum.getWxAppEnum(x.getKey()),x.getValue()));
        }
    
        /**
         * 获取配置
         * @param configValue
         * @return
         */
        public static IWxAppBaseConfig getConfig(WxAppEnum configValue){
            return configMap.get(configValue);
        }
    }
  • 相关阅读:
    asp.net中插件开发模式说明
    Url路径重写的原理
    Linux上搭建各种环境(一)
    常见Post提交数据方式接口测试
    Jmeter4.0----CSV Data Set Config_使用表格进行参数化(22)
    弱网测试----App
    性能测试基础
    使用fiddler实现手机抓包
    Jmeter4.0----发送邮箱之SMTP Sampler(21)
    Jmeter4.0----发送测试结果到邮箱之邮件观察仪(20)
  • 原文地址:https://www.cnblogs.com/july-sunny/p/12311866.html
Copyright © 2020-2023  润新知