SpringBoot策略模式优化:自定义初始化Bean结合HashMap消除If-Else

凌晨两点半
凌晨两点半
发布时间:2026-10-16| 5人浏览过
原创

本文介绍如何利用SpringBoot的InitializingBean接口结合HashMap来优化传统的策略模式实现。通过这种方式,可以在应用启动时自动完成策略与参数的映射配置,从而在业务代码中彻底消除冗长的if-else或switch判断结构,使代码更加简洁且易于扩展。

传统策略模式的局限

策略模式旨在将算法族封装起来,使其相互替换,从而让算法的变化独立于使用它的客户端。在SpringBoot环境中,传统的做法是定义公共接口、创建多个实现类,并通过Context对象根据传入的参数动态调用不同的实现。

这种基础实现方式虽然遵循了设计原则,但在实际开发中往往带来两个主要问题:

  1. 代码量大:需要大量定义接口、实现类以及上下文控制类。
  2. 条件分支复杂:在确定调用哪个策略时,通常需要依赖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编程技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。