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

通過Interface掃描獲取所有實(shí)現(xiàn)類方式

 更新時(shí)間:2025年11月19日 10:06:32   作者:碼上走人  
文章介紹了如何使用ClassPathScanningCandidateComponentProvider從指定包中掃描接口實(shí)現(xiàn)類,并通過接口統(tǒng)一管理和獲取實(shí)現(xiàn)對(duì)象,這種方法避免了手動(dòng)創(chuàng)建對(duì)象和修改代碼的問題,并且可以處理鏈路方式下的多處理器順序處理

通過Interface掃描獲取所有實(shí)現(xiàn)類

當(dāng)我們?cè)诖a中定義了一個(gè)接口,很多功能累實(shí)現(xiàn)了這個(gè)接口。所以我們可以統(tǒng)一管理這個(gè)接口,避免自己手動(dòng)創(chuàng)建對(duì)象。避免在后續(xù)的新功能假如是實(shí)現(xiàn)時(shí)修改過多的代碼,而導(dǎo)致意外出現(xiàn)。

ClassPathScanningCandidateComponentProvider 提供了一個(gè)從指定包中掃面接口實(shí)現(xiàn)類的功能。

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(BaseHandler.class));
Set<BeanDefinition> definitionSet = provider.findCandidateComponents("com.test.xxxx.handler");
for (BeanDefinition beanDefinition : definitionSet) {
      Class<?> clazz = Class.forName(beanDefinition.getBeanClassName());
      LOGGER.info("初始化數(shù)據(jù)同步處理service:{}", beanDefinition.getBeanClassName());
      BaseHandler handler= (BaseHandler) clazz.newInstance();
      
       //其他的業(yè)務(wù)邏輯,可以用map統(tǒng)一管理
       //例如接口中加如一個(gè)方法,強(qiáng)制實(shí)現(xiàn)類實(shí)現(xiàn),并給出自己的唯一Id
       HandlerDto handlerDto = service.getUnique();
        
}

這樣我們就可以獲取到所有的實(shí)現(xiàn)類并在需要的時(shí)候,傳入?yún)?shù)獲取其對(duì)象。

完整實(shí)現(xiàn)測(cè)試

如下所示:

接口

public interface BaseHandler {

    /**
     * 獲取處理器的唯一編碼  
     */
    DataHandlerDto getUnique();

    /**
     * 業(yè)務(wù)實(shí)現(xiàn)邏輯
     */
    void dealData(Object obj);
}

統(tǒng)一管理和獲取實(shí)現(xiàn)對(duì)象

@Component
public class HnadlerManager {

    public static final Map<HandlerDto, Class< ? extends BaseHandler>> HANDLER_SERVICE_MAP = new HashMap<>();


    @PostConstruct
    private static void initOperateService(){
        LOGGER.info("初始化數(shù)據(jù)同步處理handler");
        registerCollect();
    }

    private static void registerCollect(){
        ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
        provider.addIncludeFilter(new AssignableTypeFilter(BaseHandler.class));
        Set<BeanDefinition> definitionSet = provider.findCandidateComponents("com.eshore.cnomp.handler");
        try {
            for (BeanDefinition beanDefinition : definitionSet) {
                Class<?> clazz = Class.forName(beanDefinition.getBeanClassName());
                LOGGER.info("初始化數(shù)據(jù)同步處理service:{}", beanDefinition.getBeanClassName());
                BaseHandler service = (BaseHandler) clazz.newInstance();
                HandlerDto handlerDto = service.getUnique();
                boolean iscontain = false;
                for(Map.Entry<HandlerDto,Class< ? extends BaseHandler>> entry: HANDLER_SERVICE_MAP.entrySet()){
                    HandlerDto dto = entry.getKey();
                    if(dto.getId.equals(handlerDto.getId())){
                        iscontain = true;
                        LOGGER.info("已存在相同數(shù)據(jù)同步處理類:{}, {}",entry.getValue().getName(), JSON.toJSONString(dto));
                    }
                }

                if(!iscontain){
                    HANDLER_SERVICE_MAP.put(HandlerDto, service.getClass());
                }
            }
        }catch (Exception e){
            LOGGER.error("初始化數(shù)據(jù)同步處理service失敗", e);
            throw new RuntimeException("初始化數(shù)據(jù)同步處理service失敗");
        }
    }

    public static BaseHandler getHandler(String id){
        for(Map.Entry<HandlerDto,Class< ? extends BaseHandler>> entry: HANDLER_SERVICE_MAP.entrySet()){
            HandlerDto dto = entry.getKey();
            if(dto.getId.equals(id)){
                Class<? extends BaseHandler> clazz = entry.getValue();
                try {
                    return clazz.newInstance();
                } catch (Exception e) {
                    LOGGER.error("構(gòu)建采集兌現(xiàn)失敗", e);
                    return null;
                }
            }
        }
        return null;
    }

}

以上實(shí)現(xiàn)是單個(gè)兌現(xiàn)的實(shí)現(xiàn)。

如果需要以鏈路的方式,即同一個(gè)對(duì)象可以被多個(gè)處理器順序處理,則需要調(diào)整其存儲(chǔ)的方式為list并加入排序。

總結(jié)

這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java防止頻繁請(qǐng)求、重復(fù)提交的操作代碼(后端防抖操作)

    Java防止頻繁請(qǐng)求、重復(fù)提交的操作代碼(后端防抖操作)

    在客戶端網(wǎng)絡(luò)慢或者服務(wù)器響應(yīng)慢時(shí),用戶有時(shí)是會(huì)頻繁刷新頁面或重復(fù)提交表單的,這樣是會(huì)給服務(wù)器造成不小的負(fù)擔(dān)的,同時(shí)在添加數(shù)據(jù)時(shí)有可能造成不必要的麻煩,今天通過本文給大家介紹下Java防止頻繁請(qǐng)求、重復(fù)提交的操作代碼,一起看看吧
    2022-04-04
  • 學(xué)習(xí)java一定要知道的垃圾收集器

    學(xué)習(xí)java一定要知道的垃圾收集器

    這篇文章主要介紹了學(xué)習(xí)java一定要知道的垃圾收集器,垃圾收集器的發(fā)展路線,簡(jiǎn)單來說是隨著內(nèi)存越來越大而發(fā)生變化,更多相關(guān)介紹需要的朋友可以參考一下
    2022-07-07
  • Java常見面試題之final在java中的作用是什么

    Java常見面試題之final在java中的作用是什么

    這篇文章主要介紹了Java常見面試題之final在java中的作用是什么,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 詳解Java線程中斷知識(shí)點(diǎn)

    詳解Java線程中斷知識(shí)點(diǎn)

    在本篇文章中我們給大家分享了關(guān)于Java線程中斷的相關(guān)知識(shí)點(diǎn)內(nèi)容以及相關(guān)代碼實(shí)例,有興趣的朋友們可以學(xué)習(xí)下。
    2018-09-09
  • AQS同步組件Semaphore信號(hào)量案例剖析

    AQS同步組件Semaphore信號(hào)量案例剖析

    這篇文章主要為大家介紹了AQS同步組件Semaphore信號(hào)量案例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • SpringCloud大文件分片斷點(diǎn)上傳實(shí)現(xiàn)原理

    SpringCloud大文件分片斷點(diǎn)上傳實(shí)現(xiàn)原理

    這篇文章主要介紹了SpringCloud大文件分片斷點(diǎn)上傳實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java String類用法詳解

    Java String類用法詳解

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java String類用法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決

    java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決

    這篇文章主要給大家介紹了關(guān)于java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決辦法,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • Java中將String轉(zhuǎn)換為int的多種方法

    Java中將String轉(zhuǎn)換為int的多種方法

    字符串轉(zhuǎn)換為整數(shù)是一個(gè)常見需求,本文主要介紹了Java中將String轉(zhuǎn)換為int的多種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 使用idea自動(dòng)生成序列化ID全過程

    使用idea自動(dòng)生成序列化ID全過程

    這篇文章主要介紹了使用idea自動(dòng)生成序列化ID全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論

盐边县| 宜昌市| 重庆市| 迁安市| 平乡县| 临泉县| 开阳县| 横山县| 尤溪县| 高州市| 铜陵市| 漳浦县| 延庆县| 西城区| 贡觉县| 板桥市| 古浪县| 杭锦旗| 旺苍县| 电白县| 高阳县| 鹤峰县| 濉溪县| 图木舒克市| 清水县| 宁都县| 清水河县| 宜良县| 怀化市| 仁化县| 鄂托克前旗| 衡阳县| 安塞县| 定安县| 宝鸡市| 高唐县| 拜泉县| 镇平县| 剑川县| 金坛市| 武冈市|