SpringBoot策略模式优化:自定义初始化Bean结合HashMap消除If-Else
本文介绍如何利用SpringBoot的InitializingBean接口结合HashMap来优化传统的策略模式实现。通过这种方式,可以在应用启动时自动完成策略与参数的映射配置,从而在业务代码中彻底消除冗长的if-else或switch判断结构,使代码更加简洁且易于扩展。
传统策略模式的局限
策略模式旨在将算法族封装起来,使其相互替换,从而让算法的变化独立于使用它的客户端。在SpringBoot环境中,传统的做法是定义公共接口、创建多个实现类,并通过Context对象根据传入的参数动态调用不同的实现。
这种基础实现方式虽然遵循了设计原则,但在实际开发中往往带来两个主要问题:
- 代码量大:需要大量定义接口、实现类以及上下文控制类。
- 条件分支复杂:在确定调用哪个策略时,通常需要依赖
if-else或switch-case语句,随着策略增加,维护成本显著上升。
优化方案:初始化Bean与Map映射
为了优化上述问题,可以利用Spring容器的特性,在应用启动阶段(Bean初始化时)将所有策略实现类及其对应的Key自动注册到一个HashMap中。后续请求只需通过Key从Map中获取对应的策略对象并执行即可,无需任何条件判断。
第1步:定义公共策略接口
首先创建一个公共接口,定义统一的方法签名。这是所有策略执行的入口。
package com.itcq.service.StrategyPattern;
public interface CommonService {
String push(String key);
}
第2步:创建具体的策略实现类
接下来创建多个实现该接口的具体类,并使用@Service注解将其交由Spring容器管理。这里以三个简单的策略为例:
package com.itcq.service.StrategyPattern;
import org.springframework.stereotype.Service;
@Service
public class TestOne implements CommonService {
@Override
public String push(String key) {
return "1.这是模式:" + key;
}
}
package com.itcq.service.StrategyPattern;
import org.springframework.stereotype.Service;
@Service
public class TestTwo implements CommonService{
@Override
public String push(String key) {
return "2.这是模式:"+key;
}
}
package com.itcq.service.StrategyPattern;
import org.springframework.stereotype.Service;
@Service
public class TestThree implements CommonService{
@Override
public String push(String key) {
return "3.这是模式:"+key;
}
}
第3步:定义策略映射枚举
为了规范管理,建议定义一个枚举类来确定每个策略的标识Key。这有助于保持代码的类型安全。
@Getter
public enum StrategyTestEnum {
STRATEGY_ONE("一", "模式一"),
STRATEGY_TWO("二", "模式二"),
STRATEGY_THREE("三", "模式三");
private String title;
private String value;
StrategyTestEnum(String title, String value) {
this.title = title;
this.value = value;
}
}
第4步:实现InitializingBean进行初始化配置
这是优化的核心步骤。创建一个Service类,实现InitializingBean接口。Spring在初始化该Bean后,会回调afterPropertiesSet()方法。在此方法中,通过ApplicationContext获取所有策略Bean实例,并将枚举Key作为Map的键,策略对象作为值存入HashMap。
@Service
public class TestServiceTwo implements InitializingBean {
@Autowired
private ApplicationContext applicationContext;
private HashMap<String, CommonService> hashmap = new HashMap<>();
@Override
public void afterPropertiesSet() {
// 将不同策略的Key与实现类对象绑定
hashmap.put(StrategyTestEnum.STRATEGY_ONE.getTitle(), new TestOne());
hashmap.put(StrategyTestEnum.STRATEGY_TWO.getTitle(), this.applicationContext.getBean(TestTwo.class));
hashmap.put(StrategyTestEnum.STRATEGY_THREE.getTitle(), this.applicationContext.getBean(TestThree.class));
}
// ... 后续提供获取策略的方法
}
注:此处可以直接通过new关键字实例化实现类,也可以通过ApplicationContext获取已注册的Bean,两者在功能上等价。
第5步:封装业务调用逻辑
在同一个Service中添加一个辅助方法,根据外部传入的Key从Map中取出对应的策略对象并执行。Assert.notNull用于确保参数合法,防止空指针异常。
public String testMethod2(String key) {
CommonService commonService = hashmap.get(key);
Assert.notNull(commonService, "参数错误,找不到模式");
return commonService.push(key);
}
Controller层测试验证
最后,在Controller层注入该服务,通过HTTP请求进行测试。此时接口内部没有任何复杂的逻辑分支。
@Autowired
private TestServiceTwo testServiceTwo;
@GetMapping("/test/two")
public String testMethodTwo(@RequestParam(name = "key") String key) {
return testServiceTwo.testMethod2(key);
}
测试结果对比
当传入正确的Key(如“一”、“二”、“三”)时,系统能准确返回对应的策略处理结果:
当传入错误的Key时,系统会通过断言抛出明确的错误提示,便于快速定位问题:
总结
这种结合InitializingBean与HashMap的策略模式优化方案,将原本分散在各处的判断逻辑前置到了应用初始化阶段。它不仅减少了冗余的条件判断语句,使得核心业务逻辑更加清晰,还极大地提高了代码的扩展性——新增策略只需添加实现类和更新枚举及Map映射,无需修改原有的业务代码。以上就是SpringBoot自定义初始化Bean结合HashMap优化策略模式的详细内容,更多关于Java SpringBoot编程技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













