最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot優(yōu)雅實現(xiàn)接口的多實現(xiàn)類方式詳解

 更新時間:2025年10月21日 14:57:02   作者:一線大碼  
這篇文章主要為大家詳細介紹了SpringBoot優(yōu)雅實現(xiàn)接口的多實現(xiàn)類方式的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

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", "銀聯(lián)");

    private final String code;
    private final String name;
}

1.2. 支付服務(wù)接口

package com.example.demo.service;

import com.example.demo.enums.PaymentTypeEnum;

import java.math.BigDecimal;

/**
 * 支付服務(wù)
 *
 * @author wangbo
 */
public interface PaymentService {
    /**
     * 獲取支付方式
     *
     * @return PaymentTypeEnum
     */
    PaymentTypeEnum getPaymentType();

    /**
     * 處理支付
     *
     * @param amount 金額
     */
    void processPayment(BigDecimal amount);
}

1.3. 支付服務(wù)實現(xiàn)類

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;

/**
 * 支付服務(wù)實現(xiàn)-支付寶支付
 *
 * @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;

/**
 * 支付服務(wù)實現(xiàn)-微信支付
 *
 * @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. 支付服務(wù)策略管理器

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;

/**
 * 支付服務(wù)策略管理器
 *
 * @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. 使用代碼

訂單處理中需要調(diào)用支付服務(wù)

2.1. 訂單服務(wù)接口

package com.example.demo.service;

import com.example.demo.enums.PaymentTypeEnum;

import java.math.BigDecimal;

/**
 * 訂單服務(wù)
 *
 * @author wangbo
 */
public interface OrderService {
    /**
     * 處理訂單
     *
     * @param paymentTypeEnum 支付方式
     * @param amount          支付金額
     */
    void processOrder(PaymentTypeEnum paymentTypeEnum, BigDecimal amount);
}

2.2. 訂單服務(wù)實現(xiàn)類

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;

/**
 * 訂單服務(wù)實現(xiàn)
 *
 * @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

分別調(diào)用三次后,日志如下:

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: 不支持的支付方式: 銀聯(lián)] with root cause

java.lang.IllegalArgumentException: 不支持的支付方式: 銀聯(lián)
    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]

到此這篇關(guān)于SpringBoot優(yōu)雅實現(xiàn)接口的多實現(xiàn)類方式詳解的文章就介紹到這了,更多相關(guān)SpringBoot接口多實現(xiàn)類方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JVM回收跨代垃圾的方式詳解

    JVM回收跨代垃圾的方式詳解

    在Java堆內(nèi)存中,年輕代和老年代之間存在的對象相互引用,假設(shè)現(xiàn)在要進行一次新生代的YGC,但新生代中的對象可能被老年代所引用的,為了找到新生代中的存活對象,不得不遍歷整個老年代,這樣明顯效率很低下,那么如何快速識別并回收這種引用對象呢
    2024-02-02
  • Springboot的啟動原理詳細解讀

    Springboot的啟動原理詳細解讀

    這篇文章主要介紹了Springboot的啟動原理詳細解讀,springboot項目一般都是打包成jar包直接運行main方法啟動,當然也可以跟傳統(tǒng)的項目一樣打包war包放在tomcat里面啟動.那么springboot怎么直接通過main方法啟動呢,需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)HTTP請求的4種方式總結(jié)

    Java實現(xiàn)HTTP請求的4種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)HTTP請求的4種方式,在java開發(fā)中,經(jīng)常遇到需要調(diào)用第三方提供的接口服務(wù)的需求,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-08-08
  • 詳解Spring Boot 部署與服務(wù)配置

    詳解Spring Boot 部署與服務(wù)配置

    本篇文章主要介紹了詳解Spring Boot 部署與服務(wù)配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Spring Data JPA中 in 條件參數(shù)的傳遞方式

    Spring Data JPA中 in 條件參數(shù)的傳遞方式

    這篇文章主要介紹了Spring Data JPA中 in 條件參數(shù)的傳遞方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot整合Netty的流程步驟

    SpringBoot整合Netty的流程步驟

    Netty是一個基于Java的開源網(wǎng)絡(luò)應(yīng)用框架,它提供了高性能、異步事件驅(qū)動的網(wǎng)絡(luò)編程能力,Netty旨在幫助開發(fā)者構(gòu)建高性能、高可靠性的網(wǎng)絡(luò)應(yīng)用程序,本文給大家詳細介紹了SpringBoot整合Netty的流程步驟,需要的朋友可以參考下
    2023-09-09
  • Git工具 conflict沖突問題解決方案

    Git工具 conflict沖突問題解決方案

    這篇文章主要介紹了Git工具 conflict沖突問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java this、final等關(guān)鍵字總結(jié)

    Java this、final等關(guān)鍵字總結(jié)

    這篇文章主要對java中this、final等關(guān)鍵字進行了總結(jié),需要的朋友可以參考下
    2017-04-04
  • 詳解關(guān)于eclipse中使用jdk15對應(yīng)javafx15的配置問題總結(jié)

    詳解關(guān)于eclipse中使用jdk15對應(yīng)javafx15的配置問題總結(jié)

    這篇文章主要介紹了詳解關(guān)于eclipse中使用jdk15對應(yīng)javafx15的配置問題總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Spring中的singleton和prototype的實現(xiàn)

    Spring中的singleton和prototype的實現(xiàn)

    這篇文章主要介紹了Spring中的singleton和prototype的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07

最新評論

金寨县| 宜丰县| 绥芬河市| 铁力市| 南京市| 安宁市| 鄂托克旗| 凤山县| 外汇| 将乐县| 武隆县| 德江县| 灵台县| 泾源县| 佛坪县| 姚安县| 平南县| 东平县| 孟津县| 富裕县| 图木舒克市| 新巴尔虎右旗| 巴中市| 叙永县| 嫩江县| 临洮县| 井研县| 凉城县| 成都市| 盘锦市| 蕉岭县| 北宁市| 府谷县| 浮山县| 册亨县| 灵丘县| 宜宾市| 通河县| 中方县| 吐鲁番市| 汝城县|