JAVA 策略模式使用spring托管其实现类

上一篇的"JAVA 替代SWITCH 枚举值 CASE 的 策略模式 " 中使用new关键字实例化一个类时,这个类的实例不由Spring容器管理,因此@Autowired注解在这个实例中不会生效。Spring的依赖注入功能仅对其管理的bean有效,即那些通过Spring容器创建和管理的bean。

下面是spring托管其实现类方法:

java 复制代码
@Service("checkAreaListItemService")
public class CheckAreaListItemServiceImpl extends ApiFrag implements CheckListItemService {


    @Override
    public void check(Long tenantId,List<SysLimitItemGroupmx> mxList) throws Exception{
        String typeName= LimitItemTypeEnum.AREA.getInfo();
        Terme term=new Terme();
        term.setTenantId(tenantId);
        term.setQydmlist(listField2StrList(mxList,"dxdm"));
        List<Quyu> list = getQuyuList$api(term);
        Map<String, String> map  = new HashMap();;
        for (Quyu quyu : list) {
            map.put(quyu.getQydm(), quyu.getQymc());
        }
        for (SysLimitItemGroupmx itemGroupmx : mxList) {
            String key=itemGroupmx.getDxdm();
            boolean flag = map.containsKey(key);
            if(flag)    itemGroupmx.setDxmc(map.get(key));
            else    itemGroupmx.setBz(typeName + "编码对应的数据不存在!");
            itemGroupmx.setFlag(flag);
        }
    }



@Service("checkBrandListItemService")
public class CheckBrandListItemServiceImpl extends ApiFrag implements CheckListItemService {


    @Override
    public void check(Long tenantId,List<SysLimitItemGroupmx> mxList) throws Exception{
        String typeName= LimitItemTypeEnum.BRAND.getInfo();
        Terme term=new Terme();
        term.setTenantId(tenantId);
        term.setPpdmlist(listField2StrList(mxList,"dxdm"));
        List<Pinpai> list = getPinpaiList$api(term);
        Map<String, String> map  = new HashMap();;
        for (Pinpai item : list) {
            map.put(item.getPpdm(), item.getPpmc());
        }
        for (SysLimitItemGroupmx itemGroupmx : mxList) {
            String key=itemGroupmx.getDxdm();
            boolean flag = map.containsKey(key);
            if(flag)    itemGroupmx.setDxmc(map.get(key));
            else    itemGroupmx.setBz(typeName + "编码对应的数据不存在!");
            itemGroupmx.setFlag(flag);
        }
    }



}

上下文类:

java 复制代码
@Slf4j
@Component
public class CheckLimitItemProcessor {



    private final Map<Integer, String> strategyMap;

    public CheckLimitItemProcessor() {
        strategyMap = new HashMap<>();
        strategyMap.put(LimitItemTypeEnum.AREA.getNumber(), "checkAreaListItemService");
        strategyMap.put(LimitItemTypeEnum.BRAND.getNumber(),"CheckBrandListItemService");
        strategyMap.put(LimitItemTypeEnum.CUSTOMER.getNumber(), "CheckCustomerListItemService");
        strategyMap.put(LimitItemTypeEnum.SHOP.getNumber(), "checkShopListItemService");
        strategyMap.put(LimitItemTypeEnum.STORE.getNumber(), "checkStoreListItemService");
        strategyMap.put(LimitItemTypeEnum.SUPPLIER.getNumber(), "checkSupplierListItemService");

    }

    public void checkItem( ApplicationContext context,Integer type,Long tenantId, List<SysLimitItemGroupmx> mxList)
            throws Exception{
        log.info("context:{}",context);

        CheckListItemService strategy = context.getBean(strategyMap.get(type), CheckListItemService.class);
        if (strategy == null) {
            throw new IllegalArgumentException("Unsupported LimitItem type.");
        }
        strategy.check(tenantId,mxList);
    }

}

使用类:

java 复制代码
   @Autowired private ApplicationContext context;

    private void checkData(Integer type, List<SysLimitItemGroupmx> resList) throws Exception {
        Long tenantId=getPresentTenantId();
        CheckLimitItemProcessor processor = new CheckLimitItemProcessor();
        processor.checkItem(context,type,tenantId,resList);
}
相关推荐
想学习java初学者8 小时前
SpringBoot整合Vertx-Mqtt多租户(优化版)
java·spring boot·后端
AC赳赳老秦8 小时前
政企内网落地:OpenClaw 离线环境深度适配方案,无外网场景下本地化模型对接与全功能使用
java·大数据·运维·python·自动化·deepseek·openclaw
weixin_449173658 小时前
在 Java 中,‌线程安全的 List‌ 主要有以下几种实现方式,它们的效率取决于具体的使用场景(尤其是读写比例):
java·线程安全的list
砚底藏山河9 小时前
股票数据API接口:如何获取股票历历史分时KDJ数据
java·python·maven
MegaDataFlowers10 小时前
运行若依项目
java
lulu121654407810 小时前
JetBrains IDE 终极AI编程方案:CC GUI插件让Claude Code和Codex丝滑运行
java·ide·人工智能·python·ai编程
('-')11 小时前
八股复习2:Java Array list和Linked list
java·开发语言
逸Y 仙X11 小时前
Elasticsearch时间类型实战
java·大数据·elasticsearch·搜索引擎·全文检索
Gerardisite12 小时前
企微批量群发消息指南:用 QiWe 省掉人工操作
java·python·机器人·企业微信
青山师13 小时前
动态代理深度解析:JDK与CGLIB底层实现与实战
java·设计模式·面试·动态代理·java面试·cglib