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

SpringBoot根據(jù)參數(shù)動(dòng)態(tài)調(diào)用接口實(shí)現(xiàn)類方法

 更新時(shí)間:2025年02月27日 08:35:35   作者:AAA_boy  
在?Spring?Boot?開發(fā)中,我們經(jīng)常會(huì)遇到根據(jù)不同參數(shù)調(diào)用接口不同實(shí)現(xiàn)類方法的需求,本文將詳細(xì)介紹如何實(shí)現(xiàn)這一功能,有需要的小伙伴可以參考下

在 Spring Boot 開發(fā)中,我們經(jīng)常會(huì)遇到根據(jù)不同參數(shù)調(diào)用接口不同實(shí)現(xiàn)類方法的需求。本文將詳細(xì)介紹如何實(shí)現(xiàn)這一功能,并處理當(dāng)對(duì)應(yīng)實(shí)現(xiàn)類不存在時(shí)調(diào)用默認(rèn)方法的情況。

需求背景

假設(shè)有一個(gè)接口 I,它有三個(gè)實(shí)現(xiàn)類 AB、C,且這三個(gè)實(shí)現(xiàn)類都使用 @Service 注解注冊(cè)到 Spring 容器中,其對(duì)應(yīng)的 Bean 名稱為 type + "Service"。我們需要根據(jù)傳入的參數(shù) type 動(dòng)態(tài)調(diào)用不同實(shí)現(xiàn)類的 m 方法,若 type 對(duì)應(yīng)的實(shí)現(xiàn)類不存在,則調(diào)用默認(rèn)方法。

實(shí)現(xiàn)步驟

1. 定義接口

首先,我們定義接口 I,該接口包含一個(gè) m 方法。

public interface I {
    void m();
}

2. 實(shí)現(xiàn)類 A、B、C

創(chuàng)建接口 I 的三個(gè)實(shí)現(xiàn)類 A、B、C,并使用 @Service 注解將它們注冊(cè)為 Spring Bean。

import org.springframework.stereotype.Service;

@Service("AService")
public class A implements I {
    @Override
    public void m() {
        System.out.println("Executing method m in class A");
    }
}

@Service("BService")
public class B implements I {
    @Override
    public void m() {
        System.out.println("Executing method m in class B");
    }
}

@Service("CService")
public class C implements I {
    @Override
    public void m() {
        System.out.println("Executing method m in class C");
    }
}

3. 創(chuàng)建服務(wù)工廠類

創(chuàng)建一個(gè)服務(wù)工廠類 ServiceFactory,用于根據(jù) type 參數(shù)獲取對(duì)應(yīng)的實(shí)現(xiàn)類 Bean。若找不到對(duì)應(yīng)的 Bean,則返回一個(gè)默認(rèn)實(shí)現(xiàn)。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class ServiceFactory {

    @Autowired
    private ApplicationContext applicationContext;

    public I getService(String type) {
        String beanName = type + "Service";
        try {
            return applicationContext.getBean(beanName, I.class);
        } catch (Exception e) {
            // 這里可以添加默認(rèn)的處理邏輯
            return new I() {
                @Override
                public void m() {
                    System.out.println("Executing default implementation of method m");
                }
            };
        }
    }
}

4. 控制器類(可選)

如果需要通過(guò) HTTP 請(qǐng)求觸發(fā)方法調(diào)用,可以創(chuàng)建一個(gè)控制器類 MyController。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @Autowired
    private ServiceFactory serviceFactory;

    @GetMapping("/execute")
    public String execute(@RequestParam String type) {
        I service = serviceFactory.getService(type);
        service.m();
        return "Method executed for type: " + type;
    }
}

5. 測(cè)試類

創(chuàng)建一個(gè)測(cè)試類 Application,在 run 方法中測(cè)試不同 type 的服務(wù)調(diào)用,包括一個(gè)不存在的 type 以驗(yàn)證默認(rèn)邏輯。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private ServiceFactory serviceFactory;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) {
        I serviceA = serviceFactory.getService("A");
        serviceA.m();

        I serviceB = serviceFactory.getService("B");
        serviceB.m();

        I serviceC = serviceFactory.getService("C");
        serviceC.m();

        I defaultService = serviceFactory.getService("D");
        defaultService.m();
    }
}

代碼解釋

  • 接口 I:定義了一個(gè)方法 m,供實(shí)現(xiàn)類實(shí)現(xiàn)。
  • 實(shí)現(xiàn)類 A、B、C:分別實(shí)現(xiàn)了接口 I 的 m 方法,并使用 @Service 注解注冊(cè)為 Bean。
  • 服務(wù)工廠類 ServiceFactory:通過(guò) ApplicationContext 根據(jù) type 嘗試獲取對(duì)應(yīng)的實(shí)現(xiàn)類 Bean,如果找不到則返回一個(gè)匿名內(nèi)部類實(shí)現(xiàn)的默認(rèn)邏輯。
  • 控制器類 MyController:提供一個(gè) HTTP 接口 /execute,根據(jù)傳入的 type 調(diào)用對(duì)應(yīng)的服務(wù)方法。
  • 測(cè)試類 Application:在 run 方法中測(cè)試不同 type 的服務(wù)調(diào)用,包括一個(gè)不存在的 type 以驗(yàn)證默認(rèn)邏輯。

注意事項(xiàng)

  • 不能直接將 @Service 注解加在接口上,因?yàn)榻涌诒旧聿荒鼙粚?shí)例化,無(wú)法作為具體的 Bean 被 Spring 容器管理。
  • 在 ServiceFactory 類中,當(dāng)找不到對(duì)應(yīng) type 的 Bean 時(shí),返回的默認(rèn)實(shí)現(xiàn)可以根據(jù)實(shí)際需求進(jìn)行修改和擴(kuò)展。

通過(guò)以上步驟,我們可以在 Spring Boot 項(xiàng)目中根據(jù)參數(shù) type 動(dòng)態(tài)調(diào)用接口不同實(shí)現(xiàn)類的方法,并處理當(dāng)對(duì)應(yīng)實(shí)現(xiàn)類不存在時(shí)調(diào)用默認(rèn)方法的情況。

到此這篇關(guān)于SpringBoot根據(jù)參數(shù)動(dòng)態(tài)調(diào)用接口實(shí)現(xiàn)類方法的文章就介紹到這了,更多相關(guān)SpringBoot動(dòng)態(tài)調(diào)用接口實(shí)現(xiàn)類方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中線程池最實(shí)用的創(chuàng)建與關(guān)閉指南

    java中線程池最實(shí)用的創(chuàng)建與關(guān)閉指南

    試中經(jīng)常會(huì)問(wèn)到,創(chuàng)建一個(gè)線程池需要哪些參數(shù)啊,線程池的工作原理啊,卻很少會(huì)問(wèn)到線程池如何安全關(guān)閉的,下面這篇文章主要給大家介紹了關(guān)于java中線程池最實(shí)用的創(chuàng)建與關(guān)閉的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Java中的Comparable接口和Comparator接口核心機(jī)制詳解

    Java中的Comparable接口和Comparator接口核心機(jī)制詳解

    Java中的Comparable和Comparator接口是實(shí)現(xiàn)對(duì)象比較和排序的兩種核心機(jī)制,本文給大家介紹Java中的Comparable接口和Comparator接口區(qū)別,感興趣的朋友一起看看吧
    2025-11-11
  • java?讀寫?ini?配置文件的示例代碼

    java?讀寫?ini?配置文件的示例代碼

    這篇文章主要介紹了java?讀寫?ini?配置文件,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例

    spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例

    本篇文章主要介紹了spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java多線程volatile原理及用法解析

    Java多線程volatile原理及用法解析

    這篇文章主要介紹了Java多線程volatile原理及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • springCloud集成nacos config的過(guò)程

    springCloud集成nacos config的過(guò)程

    本文介紹spring cloud集成nacos config的過(guò)程,通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下
    2017-08-08
  • Java中的異常Exception與處理方式詳解

    Java中的異常Exception與處理方式詳解

    這篇文章主要介紹了Java中的異常Exception與處理方式詳解, Java語(yǔ)言中,將程序執(zhí)行中發(fā)生的不正常情況稱為"異常"(開發(fā)過(guò)程中的語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤不是異常),需要的朋友可以參考下
    2024-01-01
  • MyBatis中多對(duì)多關(guān)系的映射和查詢

    MyBatis中多對(duì)多關(guān)系的映射和查詢

    本文主要介紹了MyBatis中多對(duì)多關(guān)系的映射和查詢的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • SpringCloud開發(fā)課程查詢功能

    SpringCloud開發(fā)課程查詢功能

    這篇文章主要介紹了SpringCloud開發(fā)課程查詢功能,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

通海县| 湖口县| 绍兴市| 三台县| 蒲城县| 盖州市| 新平| 留坝县| 东海县| 察隅县| 桂平市| 常熟市| 马尔康县| 富民县| 龙泉市| 锦屏县| 金门县| 项城市| 于田县| 仙居县| 闵行区| 怀化市| 什邡市| 莎车县| 高密市| 英德市| 徐水县| 基隆市| 长治市| 大厂| 安国市| 曲沃县| 黄陵县| 三台县| 章丘市| 祁东县| 南漳县| 蒙阴县| 丰镇市| 普格县| 区。|