You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何将@Service注解的策略类实例存入状态映射Map?

Spring Boot 策略模式:按自定义存款状态绑定实现类实例

要实现以deposit.status作为Key存储NoticeTemplateService实现类,核心思路是用自定义注解标记实现类对应的状态,再通过Spring上下文收集实例并完成Map映射,具体步骤如下:

1. 定义自定义注解绑定状态

先创建一个运行时注解,用来标记每个实现类对应的存款状态:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoticeTemplateBinding {
    String status(); // 对应deposit.status的具体值,比如"ACTIVE"、"EXPIRED"
}

2. 给实现类添加注解

在每个带@Service的实现类上,用上面的注解指定对应的存款状态:

@Service
@NoticeTemplateBinding(status = "ACTIVE")
public class ActiveDepositNoticeService implements NoticeTemplateService {
    @Override
    public void generateNotice(Deposit deposit) {
        // 处理存款激活状态的通知逻辑
    }
}

@Service
@NoticeTemplateBinding(status = "EXPIRED")
public class ExpiredDepositNoticeService implements NoticeTemplateService {
    @Override
    public void generateNotice(Deposit deposit) {
        // 处理存款过期状态的通知逻辑
    }
}

3. 实现策略持有者,自动填充Map

创建一个Spring组件,通过构造注入获取所有NoticeTemplateService实现类,遍历并根据注解的status值完成Map的填充:

@Component
public class NoticeTemplateStrategyManager {
    private final Map<String, NoticeTemplateService> strategyMap;

    // Spring会自动注入所有NoticeTemplateService类型的Bean到List中
    public NoticeTemplateStrategyManager(List<NoticeTemplateService> templateServices) {
        this.strategyMap = new HashMap<>();
        for (NoticeTemplateService service : templateServices) {
            NoticeTemplateBinding binding = service.getClass().getAnnotation(NoticeTemplateBinding.class);
            if (binding != null) {
                // 校验重复key,避免覆盖
                if (strategyMap.containsKey(binding.status())) {
                    throw new IllegalStateException("Duplicate status binding: " + binding.status());
                }
                strategyMap.put(binding.status(), service);
            }
        }
    }

    // 提供获取对应策略的方法
    public NoticeTemplateService getStrategy(String depositStatus) {
        return strategyMap.get(depositStatus);
    }
}

4. 业务中使用策略Map

在需要使用的业务类中,注入NoticeTemplateStrategyManager,直接通过存款状态获取对应的实现类:

@Service
public class DepositNoticeHandler {
    private final NoticeTemplateStrategyManager strategyManager;

    public DepositNoticeHandler(NoticeTemplateStrategyManager strategyManager) {
        this.strategyManager = strategyManager;
    }

    public void processNotice(Deposit deposit) {
        NoticeTemplateService templateService = strategyManager.getStrategy(deposit.getStatus());
        if (templateService == null) {
            throw new IllegalArgumentException("Unsupported deposit status: " + deposit.getStatus());
        }
        templateService.generateNotice(deposit);
    }
}

注意事项

  • 确保每个status值唯一绑定一个实现类,初始化时的重复校验可以避免后续逻辑混乱
  • 如果需要默认实现,可以在getStrategy方法中返回一个默认的NoticeTemplateService实例,而非直接抛出异常

内容的提问来源于stack exchange,提问作者robert trudel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:53:15