欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot頂層接口實現(xiàn)類注入項目的方法示例

 更新時間:2024年06月17日 08:55:11   作者:木星mx  
本文主要介紹了SpringBoot頂層接口實現(xiàn)類注入項目的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1、背景

在項目中,我們通常會具有同一特性的業(yè)務類定義一個頂層接口,讓業(yè)務類實現(xiàn)這個接口,通過接口規(guī)范來管理這些類。我們將這些實現(xiàn)接口的業(yè)務類交托給Spring容器接口后,有時候需要根據(jù)業(yè)務類型來選擇動態(tài)選擇對應的業(yè)務類阿里處理業(yè)務。這個時候就獲取到這些業(yè)務類并進行管理,在需要時取出對應的業(yè)務類處理業(yè)務。如何管理就是本期要介紹的內(nèi)容。

以下是我定義的一個簡單的頂層接口,它有兩個方法,一個是提供類型的getType()方法,一個是處理業(yè)務的hanlde()方法。我們的任務就是對其實現(xiàn)類進行管理,當需要時可根據(jù)類型獲取對應實現(xiàn)類。

public interface IBaseHandler {
    /**
     * 獲取處理器類型
     * @return 處理器類型
     */
    int getType();

    /**
     * 處理業(yè)務
     * @param t 業(yè)務數(shù)據(jù)
     * @param <T> 業(yè)務數(shù)據(jù)類型
     */
    <T> void handler(T t);
}

2、簡單的管理方法

我們可以通過使用@Autowired注解將所有實現(xiàn)了IBaseHandler接口的類注入到項目當中,并在需要時遍歷業(yè)務類對象,獲取對應的對象來處理業(yè)務。代碼如下所示:

    @Autowired
    private List<IBaseHandler> handlers;
     /**
     * 處理業(yè)務
     * @param type 業(yè)務類型
     * @param data 業(yè)務數(shù)據(jù)
     * @param <T> 業(yè)務數(shù)據(jù)類型
     */
    public <T> void handle(int type, T data) {
        handlers.stream().filter(handler -> handler.getType() == type).findAny().orElseThrow(() -> {
            // 獲取不到業(yè)務類對象時打印日志并拋出異常
            log.error("Failed to get handler, type:{}", type);
            throw new NoSuchElementException("No such handler");
        }).handler(data);
    }

3、更好的管理方法

1、簡單管理方法的弊端

上面的簡單管理方法用起來方便,但是有兩個弊端:
(1)耦合度高,所有需要使用該接口的地方都需要進行注入再遍歷的過程。
(2)性能較差,每次執(zhí)行業(yè)務之前都需要遍歷一次列表。

2、解決

我們可以使用一個工具類,提供靜態(tài)方法來獲取業(yè)務類。這樣所有需要獲取業(yè)務類的地方,就都可以通過該工具類一步獲取到所需的業(yè)務類。代碼如下:

1、工具類代碼

@Slf4j
public class HandlerManager {
    /**
     * 按照type映射的處理器map
     */
    private static Map<Integer, IBaseHandler> typeHandlerMap = new HashMap<>();
    /**
     * 按照類型映射的處理器map
     */
    private static Map<Class<IBaseHandler>, IBaseHandler> clazzHandlerMap = new HashMap<>();

    /**
     * 初始化方法,項目啟動時調用該方法來初始化map
     * @param applicationContext spring 上下文對象
     */
    public static void init(ApplicationContext applicationContext) {
        List<IBaseHandler> handlers = new ArrayList<>();
        applicationContext.getBeansOfType(IBaseHandler.class).forEach((name, obj) -> handlers.add(obj));
        // 為了方便,兩次循環(huán)構建map,一次循環(huán)也可以解決,不過人為定義的handler數(shù)量不多,一次循環(huán)性能提升不大
        typeHandlerMap = handlers.stream().collect(Collectors.toMap(IBaseHandler::getType, obj -> obj));
        clazzHandlerMap = handlers.stream().collect(Collectors.toMap(obj -> (Class<IBaseHandler>) obj.getClass(), obj -> obj));
    }

    public IBaseHandler getHandlerByType(int type) {
        return Optional.ofNullable(typeHandlerMap.get(type)).orElseThrow(() -> {
            // 獲取不到處理器打印日志并拋出異常
            log.info("Failed to get handler, type:{}", type);
            throw new NoSuchElementException("No such  handler error");
        });
    }

    public IBaseHandler getHandlerByClass(Class<IBaseHandler> clazz) {
        return Optional.ofNullable(clazzHandlerMap.get(clazz)).orElseThrow(() -> {
            // 獲取不到處理器打印日志并拋出異常
            log.info("Failed to get handler, clazz:{}", clazz);
            throw new NoSuchElementException("No such  handler error");
        });
    }


}

2、調用工具類的init方法

由于工具類提供的是靜態(tài)方法,因此無法通過注入的方式來獲取到所有的IBaseHanlder,所以需要借助其他可注入IBaseHanlder的類來初始化管理對象,以下是方法:

/**
 * 項目初始化類
 * 繼承ApplicationContextAware,實現(xiàn)setApplicationContext,可獲取ApplicationContext來獲取上下文
 */
@Component
public class ApplicationInit implements ApplicationContextAware {

    @Autowired
    private List<IBaseHandler> handlers;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 調用處理器工具類初始化方法
        HandlerManager.init(applicationContext);
    }
}

到此這篇關于SpringBoot頂層接口實現(xiàn)類注入項目的方法示例的文章就介紹到這了,更多相關SpringBoot類注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 關于mybatis遇到Integer類型的參數(shù)時動態(tài)sql需要注意條件

    關于mybatis遇到Integer類型的參數(shù)時動態(tài)sql需要注意條件

    這篇文章主要介紹了關于mybatis遇到Integer類型的參數(shù)時動態(tài)sql需要注意條件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java簡單實現(xiàn)猜數(shù)字游戲附C語言版本

    Java簡單實現(xiàn)猜數(shù)字游戲附C語言版本

    猜數(shù)字是興起于英國的益智類小游戲,起源于20世紀中期,一般由兩個人或多人玩,也可以由一個人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用Java和C語言分別把這個小游戲寫出來練練手
    2021-11-11
  • Java中增強for循環(huán)的實現(xiàn)原理和坑詳解

    Java中增強for循環(huán)的實現(xiàn)原理和坑詳解

    增強的for循環(huán)是在傳統(tǒng)的for循環(huán)中增加的強大的迭代功能的循環(huán),是在jdk1.5之后提出來的。下面這篇文章主要給大家介紹了關于Java中增強for循環(huán)的實現(xiàn)原理和坑的相關資料,需要的朋友可以參考下
    2018-04-04
  • Java String、StringBuffer與StringBuilder的區(qū)別

    Java String、StringBuffer與StringBuilder的區(qū)別

    本文主要介紹Java String、StringBuffer與StringBuilder的區(qū)別的資料,這里整理了相關資料及詳細說明其作用和利弊點,有需要的小伙伴可以參考下
    2016-09-09
  • springboot中事務管理@Transactional的注意事項與使用場景

    springboot中事務管理@Transactional的注意事項與使用場景

    今天小編就為大家分享一篇關于springboot中事務管理@Transactional的注意事項與使用場景,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Java使用Knife4j優(yōu)化Swagger接口文檔的操作步驟

    Java使用Knife4j優(yōu)化Swagger接口文檔的操作步驟

    在現(xiàn)代微服務開發(fā)中,接口文檔的質量直接影響了前后端協(xié)作效率,Swagger 作為一個主流的接口文檔工具,雖然功能強大,但其默認界面和部分功能在實際使用中略顯不足,而 Knife4j 的出現(xiàn)為我們提供了一種增強的選擇,本篇文章將詳細介紹如何在項目中集成和使用 Knife4j
    2024-12-12
  • SpringMVC框架中使用Filter實現(xiàn)請求日志打印方式

    SpringMVC框架中使用Filter實現(xiàn)請求日志打印方式

    這篇文章主要介紹了SpringMVC框架中使用Filter實現(xiàn)請求日志打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • UniApp?+?SpringBoot?實現(xiàn)微信支付和退款功能

    UniApp?+?SpringBoot?實現(xiàn)微信支付和退款功能

    這篇文章主要介紹了UniApp?+?SpringBoot?實現(xiàn)微信支付和退款功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • spring security結合jwt實現(xiàn)用戶重復登錄處理

    spring security結合jwt實現(xiàn)用戶重復登錄處理

    本文主要介紹了spring security結合jwt實現(xiàn)用戶重復登錄處理,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring基于注解配置AOP詳解

    Spring基于注解配置AOP詳解

    這篇文章主要介紹了Spring基于注解配置AOP詳解,Spring 的 AOP 功能是基于 AspectJ 實現(xiàn)的,支持使用注解聲明式定義 AOP 切面,Spring 基于注解配置 AOP 需要啟用 AspectJ 自動代理功能,需要的朋友可以參考下
    2023-09-09

最新評論