当前位置: 代码网 > it编程>编程语言>Java > SpringBoot优雅实现接口的多实现类方式详解

SpringBoot优雅实现接口的多实现类方式详解

2025年10月21日 Java 我要评论
1. 样板代码1.1. 支付类型枚举package com.example.demo.enums;import lombok.allargsconstructor;import lombok.gett

1. 样板代码

1.1. 支付类型枚举

package com.example.demo.enums;

import lombok.allargsconstructor;
import lombok.getter;

/**
 * 支付类型枚举
 *
 * @author wangbo
 */
@getter
@allargsconstructor
public enum paymenttypeenum {
    alipay("alipay", "支付宝"),
    wechat("wechat", "微信"),
    unionpay("unionpay", "银联");

    private final string code;
    private final string name;
}

1.2. 支付服务接口

package com.example.demo.service;

import com.example.demo.enums.paymenttypeenum;

import java.math.bigdecimal;

/**
 * 支付服务
 *
 * @author wangbo
 */
public interface paymentservice {
    /**
     * 获取支付方式
     *
     * @return paymenttypeenum
     */
    paymenttypeenum getpaymenttype();

    /**
     * 处理支付
     *
     * @param amount 金额
     */
    void processpayment(bigdecimal amount);
}

1.3. 支付服务实现类

package com.example.demo.service.impl;

import com.example.demo.enums.paymenttypeenum;
import com.example.demo.service.paymentservice;
import lombok.extern.slf4j.slf4j;
import org.springframework.stereotype.service;

import java.math.bigdecimal;

/**
 * 支付服务实现-支付宝支付
 *
 * @author wangbo
 */
@slf4j
@service
public class paymentservicealipayimpl implements paymentservice {

    @override
    public paymenttypeenum getpaymenttype() {
        return paymenttypeenum.alipay;
    }

    @override
    public void processpayment(bigdecimal amount) {
        log.info("支付宝支付: " + amount);
    }
}
package com.example.demo.service.impl;

import com.example.demo.enums.paymenttypeenum;
import com.example.demo.service.paymentservice;
import lombok.extern.slf4j.slf4j;
import org.springframework.stereotype.service;

import java.math.bigdecimal;

/**
 * 支付服务实现-微信支付
 *
 * @author wangbo
 */
@slf4j
@service
public class paymentservicewechatimpl implements paymentservice {
    @override
    public paymenttypeenum getpaymenttype() {
        return paymenttypeenum.wechat;
    }

    @override
    public void processpayment(bigdecimal amount) {
        log.info("微信支付: " + amount);
    }
}

1.4. 支付服务策略管理器

package com.example.demo.manager;

import com.example.demo.enums.paymenttypeenum;
import com.example.demo.service.paymentservice;
import lombok.allargsconstructor;
import org.springframework.stereotype.component;

import java.util.list;

/**
 * 支付服务策略管理器
 *
 * @author wangbo
 */
@component
@allargsconstructor
public class paymentservicestrategymanager {

    private final list<paymentservice> paymentservices;

    public paymentservice getpaymentservice(paymenttypeenum paymenttypeenum) {
        for (paymentservice paymentservice : paymentservices) {
            if (paymentservice.getpaymenttype().equals(paymenttypeenum)) {
                return paymentservice;
            }
        }
        throw new illegalargumentexception("不支持的支付方式: " + paymenttypeenum.getname());
    }
}

2. 使用代码

订单处理中需要调用支付服务

2.1. 订单服务接口

package com.example.demo.service;

import com.example.demo.enums.paymenttypeenum;

import java.math.bigdecimal;

/**
 * 订单服务
 *
 * @author wangbo
 */
public interface orderservice {
    /**
     * 处理订单
     *
     * @param paymenttypeenum 支付方式
     * @param amount          支付金额
     */
    void processorder(paymenttypeenum paymenttypeenum, bigdecimal amount);
}

2.2. 订单服务实现类

package com.example.demo.service.impl;

import com.example.demo.enums.paymenttypeenum;
import com.example.demo.manager.paymentservicestrategymanager;
import com.example.demo.service.orderservice;
import com.example.demo.service.paymentservice;
import lombok.allargsconstructor;
import org.springframework.stereotype.service;

import java.math.bigdecimal;

/**
 * 订单服务实现
 *
 * @author wangbo
 */
@service
@allargsconstructor
public class orderserviceimpl implements orderservice {

    private final paymentservicestrategymanager paymentservicestrategymanager;

    @override
    public void processorder(paymenttypeenum paymenttypeenum, bigdecimal amount) {
        paymentservice paymentservice = paymentservicestrategymanager.getpaymentservice(paymenttypeenum);
        paymentservice.processpayment(amount);
    }
}

3. 测试代码

package com.example.demo.controller;

import com.example.demo.enums.paymenttypeenum;
import com.example.demo.service.orderservice;
import lombok.allargsconstructor;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.restcontroller;

import java.math.bigdecimal;

/**
 * @author wangbo
 * @since 2025/10/21
 */
@restcontroller
@allargsconstructor
public class ordercontroller {

    private final orderservice orderservice;

    @getmapping("/order")
    public string processorder() {
        orderservice.processorder(paymenttypeenum.alipay, bigdecimal.ten);
        return "支付成功";
    }

    @getmapping("/order1")
    public string processorder1() {
        orderservice.processorder(paymenttypeenum.wechat, bigdecimal.ten);
        return "支付成功";
    }

    @getmapping("/order2")
    public string processorder2() {
        orderservice.processorder(paymenttypeenum.unionpay, bigdecimal.ten);
        return "支付成功";
    }
}
  • http://localhost:8080/order
  • http://localhost:8080/order1
  • http://localhost:8080/order2

分别调用三次后,日志如下:

2025-10-21t12:01:11.144+08:00  info 32792 --- [demo] [nio-8080-exec-1] o.a.c.c.c.[tomcat].[localhost].[/]       : initializing spring dispatcherservlet 'dispatcherservlet'
2025-10-21t12:01:11.144+08:00  info 32792 --- [demo] [nio-8080-exec-1] o.s.web.servlet.dispatcherservlet        : initializing servlet 'dispatcherservlet'
2025-10-21t12:01:11.146+08:00  info 32792 --- [demo] [nio-8080-exec-1] o.s.web.servlet.dispatcherservlet        : completed initialization in 1 ms
2025-10-21t12:01:11.170+08:00  info 32792 --- [demo] [nio-8080-exec-1] c.e.d.s.impl.paymentservicealipayimpl    : 支付宝支付: 10
2025-10-21t12:01:21.053+08:00  info 32792 --- [demo] [nio-8080-exec-3] c.e.d.s.impl.paymentservicewechatimpl    : 微信支付: 10
2025-10-21t12:01:26.791+08:00 error 32792 --- [demo] [nio-8080-exec-4] o.a.c.c.c.[.[.[/].[dispatcherservlet]    : servlet.service() for servlet [dispatcherservlet] in context with path [] threw exception [request processing failed: java.lang.illegalargumentexception: 不支持的支付方式: 银联] with root cause

java.lang.illegalargumentexception: 不支持的支付方式: 银联
    at com.example.demo.manager.paymentservicestrategymanager.getpaymentservice(paymentservicestrategymanager.java:27) ~[main/:na]
    at com.example.demo.service.impl.orderserviceimpl.processorder(orderserviceimpl.java:24) ~[main/:na]
    at com.example.demo.controller.ordercontroller.processorder2(ordercontroller.java:35) ~[main/:na]
    at java.base/jdk.internal.reflect.directmethodhandleaccessor.invoke(directmethodhandleaccessor.java:103) ~[na:na]
    at java.base/java.lang.reflect.method.invoke(method.java:580) ~[na:na]
    at org.springframework.web.method.support.invocablehandlermethod.doinvoke(invocablehandlermethod.java:258) ~[spring-web-6.2.9.jar:6.2.9]
    at org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:191) ~[spring-web-6.2.9.jar:6.2.9]
    at org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:118) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlermethod(requestmappinghandleradapter.java:991) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:896) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:87) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:1089) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:979) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:1014) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:903) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at jakarta.servlet.http.httpservlet.service(httpservlet.java:564) ~[tomcat-embed-core-10.1.43.jar:6.0]
    at org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:885) ~[spring-webmvc-6.2.9.jar:6.2.9]
    at jakarta.servlet.http.httpservlet.service(httpservlet.java:658) ~[tomcat-embed-core-10.1.43.jar:6.0]
    at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:195) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:140) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.tomcat.websocket.server.wsfilter.dofilter(wsfilter.java:51) ~[tomcat-embed-websocket-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:164) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:140) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.springframework.web.filter.requestcontextfilter.dofilterinternal(requestcontextfilter.java:100) ~[spring-web-6.2.9.jar:6.2.9]
    at org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:116) ~[spring-web-6.2.9.jar:6.2.9]
    at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:164) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:140) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.springframework.web.filter.formcontentfilter.dofilterinternal(formcontentfilter.java:93) ~[spring-web-6.2.9.jar:6.2.9]
    at org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:116) ~[spring-web-6.2.9.jar:6.2.9]
    at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:164) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:140) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:201) ~[spring-web-6.2.9.jar:6.2.9]
    at org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:116) ~[spring-web-6.2.9.jar:6.2.9]
    at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:164) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:140) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:167) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:90) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:483) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:116) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:93) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:74) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:344) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.coyote.http11.http11processor.service(http11processor.java:398) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.coyote.abstractprocessorlight.process(abstractprocessorlight.java:63) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.coyote.abstractprotocol$connectionhandler.process(abstractprotocol.java:903) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.tomcat.util.net.nioendpoint$socketprocessor.dorun(nioendpoint.java:1769) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.tomcat.util.net.socketprocessorbase.run(socketprocessorbase.java:52) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.tomcat.util.threads.threadpoolexecutor.runworker(threadpoolexecutor.java:1189) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.tomcat.util.threads.threadpoolexecutor$worker.run(threadpoolexecutor.java:658) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:63) ~[tomcat-embed-core-10.1.43.jar:10.1.43]
    at java.base/java.lang.thread.run(thread.java:1583) ~[na:na]

到此这篇关于springboot优雅实现接口的多实现类方式详解的文章就介绍到这了,更多相关springboot接口多实现类方式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com