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

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

  现有的企业微信应用中,多个配置的应用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);
    }
}
原文地址:https://www.cnblogs.com/july-sunny/p/12311866.html