Spring Boot 中如何实现工厂模式依赖注入的简洁方案

来源:站长查询作者:湖南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《Spring Boot 中如何实现工厂模式依赖注入的简洁方案》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Spring Boot 中如何实现工厂模式依赖注入的简洁方案》有用,将其分享出去将是对创作者最好的鼓励。

在Spring Boot项目里,工厂模式常被用来封装同一接口不同实现类的创建逻辑,同时结合依赖注入可以让Spring管理实例的生命周期,避免手动new对象带来的耦合问题。下面介绍一种无需复杂配置的简洁实现方案。

核心实现思路

该方案的核心是通过接口定义统一的行为规范,让所有实现类都实现该接口,同时在接口中定义一个标识方法,工厂类通过Spring的ApplicationContext获取所有接口实现类的实例,再根据标识匹配对应的实例返回。

1. 定义统一业务接口

首先创建一个业务接口,内部定义业务方法和类型标识方法,所有实现类都需要实现这两个方法。

// 支付服务接口
public interface PayService {
    // 支付业务方法
    void pay(double amount);
    // 返回支付类型标识
    String getType();
}

2. 实现不同的业务子类

针对不同的支付场景,实现上面的接口,每个实现类返回不同的类型标识。

import org.springframework.stereotype.Service;

// 支付宝支付实现
@Service
public class AliPayService implements PayService {
    @Override
    public void pay(double amount) {
        System.out.println("支付宝支付金额:" + amount);
    }

    @Override
    public String getType() {
        return "ali";
    }
}

// 微信支付实现
@Service
public class WechatPayService implements PayService {
    @Override
    public void pay(double amount) {
        System.out.println("微信支付金额:" + amount);
    }

    @Override
    public String getType() {
        return "wechat";
    }
}

3. 实现工厂类

工厂类通过构造器注入所有PayService的实现类,在初始化时构建类型到实例的映射,后续根据类型标识直接返回对应实例。

import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class PayServiceFactory {
    // 存储类型到实例的映射
    private final Map<String, PayService> payServiceMap = new HashMap<>();

    // 构造器注入所有PayService实现类
    public PayServiceFactory(List<PayService> payServiceList) {
        for (PayService payService : payServiceList) {
            payServiceMap.put(payService.getType(), payService);
        }
    }

    // 根据类型获取对应的支付服务实例
    public PayService getPayService(String type) {
        PayService payService = payServiceMap.get(type);
        if (payService == null) {
            throw new IllegalArgumentException("不支持的支付类型:" + type);
        }
        return payService;
    }
}

使用示例

在业务类中注入工厂类,根据传入的类型参数获取对应的服务实例即可调用业务方法。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PayController {
    private final PayServiceFactory payServiceFactory;

    public PayController(PayServiceFactory payServiceFactory) {
        this.payServiceFactory = payServiceFactory;
    }

    @GetMapping("/pay")
    public String pay(@RequestParam String type, @RequestParam double amount) {
        PayService payService = payServiceFactory.getPayService(type);
        payService.pay(amount);
        return "支付成功";
    }
}

方案优势

  • 无需手动维护实例的创建逻辑,所有实现类由Spring自动管理,新增实现类只需要添加@Service注解并实现接口即可,工厂类无需修改。
  • 避免了传统工厂模式中大量的if-else或者switch判断逻辑,降低代码耦合度。
  • 利用Spring的依赖注入特性,实现类的依赖也可以由Spring自动注入,不需要在工厂中手动处理。

注意事项

如果多个实现类返回相同的类型标识,会导致映射覆盖,因此要保证每个实现类的getType方法返回的唯一标识不重复。如果需要支持动态扩展类型,也可以在接口中增加默认类型或者从配置中读取类型标识的逻辑。

Spring_Boot工厂模式依赖注入设计模式修改时间:2026-07-04 07:12:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。