一.为什么要使用工厂模式去优化代码
现有的企业微信应用中,多个配置的应用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); } }