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

SpringBoot根據(jù)注解動(dòng)態(tài)執(zhí)行類中的方法實(shí)現(xiàn)

 更新時(shí)間:2023年08月06日 09:53:47   作者:benben044  
本文主要介紹了SpringBoot根據(jù)注解動(dòng)態(tài)執(zhí)行類中的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、需求

有一個(gè)接口提供了xx的服務(wù),有兩個(gè)場景分別實(shí)現(xiàn)了xx的具體邏輯,標(biāo)記為xx1和xx2。

然后場景一過來的時(shí)候執(zhí)行xx1邏輯,場景二過來的時(shí)候執(zhí)行xx2邏輯。

2、簡單實(shí)現(xiàn)

定義一個(gè)service層,提供xx的接口。

然后定義兩個(gè)serviceImpl,@Service(name="")標(biāo)記不同的名稱,分別提供xx的具體實(shí)現(xiàn)。

在使用時(shí),通過@Resource(name="")注入兩個(gè)組件。

接著硬編碼,當(dāng)場景一時(shí)調(diào)用組件1的xx方法,當(dāng)場景二時(shí)調(diào)用組件2的xx方法。

這種方法可讀性較高,邏輯也清晰,但是擴(kuò)展性不高,硬編碼的硬傷。

3、通過自定義注解的方式

(1)實(shí)現(xiàn)方案

首先,構(gòu)造一個(gè)自定義注解@Extension,用于存放場景所需的信息。

其次,定義一個(gè)Service接口提供xx服務(wù)

然后,定義兩個(gè)ServiceImpl類實(shí)現(xiàn)接口的xx服務(wù),并且標(biāo)記@Service注解。同時(shí)新增@Extension注解,輸入場景信息。

接著,定義一個(gè)@PostConstruct方法,在方法中讀取容器中所有帶@Extension注解的示例,將注解的場景信息作為key,示例作為Object放入某個(gè)組件ExtRespository的Map中存起來。

最后,請求過來時(shí)解析場景信息,從ExtRespository的Map中讀取實(shí)例信息,通過Function<T,R>函數(shù)式編程調(diào)用接口的xx方法。

(2)實(shí)現(xiàn)示例

1)Extension.java

自定義注解接口

/**
 * 自定義注解
 */
@Retention(RetentionPolicy.RUNTIME) // 作用于運(yùn)行時(shí)
@Target(ElementType.TYPE)   // 作用于類上
@Component
public @interface Extension {
    String bizScene() default "defaultBizScene";
    String useCase() default "defaultUseCase";
}

2)Father.java

模擬Service接口

public interface Father {
    public String sayHello();
}

3)FatherOne.java

模擬ServiceImpl實(shí)現(xiàn)類1

@Component
@Extension(bizScene="test", useCase="one")
public class FatherOne implements Father {
    @Override
    public String sayHello() {
        System.out.println("測試: father1");
        return "father1";
    }
}

4)FatherTwo.java

模擬ServiceImpl實(shí)現(xiàn)類2

@Component
@Extension(bizScene="test", useCase="two")
public class FatherTwo implements Father{
    @Override
    public String sayHello() {
        System.out.println("測試: father2");
        return "father2";
    }
}

5)ExtInitiator.java

項(xiàng)目啟動(dòng)時(shí)的一部分初始化

@Component
public class ExtInitiator {
    @Autowired
    ExtRespository extRespository;
    @Autowired
    private ApplicationContext applicationContext;
    @PostConstruct
    public void init(){
        Map<String, Object> extensionBeans = applicationContext.getBeansWithAnnotation(Extension.class);
        for(Object bean : extensionBeans.values()){
            Class<?> extensionClz = ClassUtils.getUserClass(bean);
            Extension extension = AnnotationUtils.findAnnotation(extensionClz, Extension.class);
            String bizScene = extension.bizScene();
            String useCase = extension.useCase();
            extRespository.getExtRepository().put(bizScene + "_" + useCase, bean);
        }
    }
}

6)ExtRespository.java

組件提供map的存放

@Component
public class ExtRespository {
    private Map<String, Object> extRepository = new HashMap<>();
    public Map<String, Object> getExtRepository(){
        return extRepository;
    }
}

7)Test方法中測試

@Autowired
ExtRespository extRespository;
@Test
public void testExtension() {
    Function<Father, String> exeFunction = extention -> extention.sayHello();
    System.out.println("test_two場景下調(diào)用sayHello:" + exeFunction.apply((Father)extRespository.getExtRepository().get("test_two")));
}

運(yùn)行測試方法時(shí)顯示:

測試: father2
test_two場景下調(diào)用sayHello:father2

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

相關(guān)文章

  • SpringBoot參數(shù)校驗(yàn)Validator框架詳解

    SpringBoot參數(shù)校驗(yàn)Validator框架詳解

    Validator框架就是為了解決開發(fā)人員在開發(fā)的時(shí)候少寫代碼,提升開發(fā)效率,Validator專門用來進(jìn)行接口參數(shù)校驗(yàn),今天通過本文給大家介紹SpringBoot參數(shù)校驗(yàn)Validator框架,感興趣的朋友一起看看吧
    2022-06-06
  • Java信號量Semaphore原理及代碼實(shí)例

    Java信號量Semaphore原理及代碼實(shí)例

    這篇文章主要介紹了Java信號量Semaphore原理及代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • MyBatis中TypeHandler基本用法與示例

    MyBatis中TypeHandler基本用法與示例

    本文主要介紹了MyBatis中TypeHandler基本用法與示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • 一文弄懂fastjson

    一文弄懂fastjson

    fastjson?是一個(gè)java語言編寫的高性能且功能完善的JSON庫,本文主要介紹了fastjson的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • SpringBoot限制文件或圖片上傳大小的兩種配置方法

    SpringBoot限制文件或圖片上傳大小的兩種配置方法

    這篇文章主要介紹了SpringBoot限制文件或圖片上傳大小的兩種配置方法,一種是配置在啟動(dòng)類中,一種是配置在application.yml或者application.properties中,需要的朋友可以參考下
    2018-03-03
  • IDEA自定義pom依賴的步驟詳解

    IDEA自定義pom依賴的步驟詳解

    這篇文章主要介紹了IDEA自定義pom依賴的步驟詳解,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì)對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java?輸入輸出?IO?NIO?AIO三兄弟對比分析對比分析

    Java?輸入輸出?IO?NIO?AIO三兄弟對比分析對比分析

    這篇文章主要為大家介紹了Java?輸入輸出?IO?NIO?AIO三兄弟對比分析對比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 詳解java設(shè)計(jì)模式中的門面模式

    詳解java設(shè)計(jì)模式中的門面模式

    門面模式又叫外觀模式(Facade?Pattern),主要用于隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供了一個(gè)客戶端可以訪問系統(tǒng)的接口,本文通過實(shí)例代碼給大家介紹下java門面模式的相關(guān)知識,感興趣的朋友一起看看吧
    2022-02-02
  • Gradle:修改默認(rèn)的Build配置文件名方式

    Gradle:修改默認(rèn)的Build配置文件名方式

    這篇文章主要介紹了Gradle:修改默認(rèn)的Build配置文件名方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 新手了解java 異常處理基礎(chǔ)知識

    新手了解java 異常處理基礎(chǔ)知識

    Java中異常提供了一種識別及響應(yīng)錯(cuò)誤情況的一致性機(jī)制,有效地異常處理能使程序更加健壯、易于調(diào)試。那么這篇文章總結(jié)了Java有效處理異常的三個(gè)原則,有需要的朋友們可以參考借鑒
    2021-07-07

最新評論

鹤峰县| 淳化县| 抚顺县| 吉林省| 铜陵市| 宿松县| 綦江县| 高阳县| 云阳县| 叶城县| 张家口市| 南郑县| 东方市| 霍邱县| 宝丰县| 鄂托克前旗| 老河口市| 麻江县| 龙江县| 高碑店市| 江山市| 阜新市| 囊谦县| 阿图什市| 方山县| 合肥市| 民勤县| 喀喇| 定结县| 苏尼特右旗| 新安县| 深泽县| 文山县| 息烽县| 光泽县| 定结县| 临江市| 桃江县| 民县| 镇江市| 田阳县|