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
相关产品推荐
相关产品推荐

