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

SpringBoot利用切面注解及反射實現(xiàn)事件監(jiān)聽功能

 更新時間:2022年07月18日 14:18:22   作者:mabo_9704@163.com  
這篇文章主要介紹了springboot事件監(jiān)聽,通過利用切面、注解、反射實現(xiàn),接下來將對這幾種方式逐一說明,具有很好的參考價值,希望對大家有所幫助

前言

當(dāng)某個事件需要被監(jiān)聽的時候,我們需要去做其他的事前,最簡單的方式就是將自己的業(yè)務(wù) 方法追加到該事件之后。

但是當(dāng)有N多個這樣的需求的時候我們都這樣一個個去添加修改事件的源碼嗎?

這篇文章將告訴你如何用一個注解,就可以將你的業(yè)務(wù)代碼通過切面的方式添加到事件的前后,而不需要修改事件的代碼

效果圖

如下圖所示,add方法內(nèi)并沒有調(diào)用其他的方法,但是其他方法仍然被執(zhí)行了。

只要給監(jiān)聽方法加@AddEventListener()注解就可以讓它在事件前后執(zhí)行了

監(jiān)聽原理

該方法是利用切面、注解、反射來實現(xiàn)SpringBoot的事件監(jiān)聽的

1.通過Aspect的切面,切入事件方法

首先使用Aspec的Around(也可以用before或者after,但是比較麻煩)注解,切入AddEvent的方法中,around注解的方法中,可以在事件方法的執(zhí)行前后添加業(yè)務(wù)代碼。但是我們不直接加入需要添加的業(yè)務(wù),進入第二步驟。

2.利用反射獲取被AddEventAop注解的類和方法

利用反射Class.forName(class),獲取被AddEventAop注解的類(當(dāng)然你也可以修改一下,獲取所有的類),該類哪個方法被AddEventListener注解了,就執(zhí)行該方法,則監(jiān)聽執(zhí)行成功。

method.invoke(o, args);

注意(非常重要)

  • AddEventListener使用的類上,必須被AddEventAop注解了,否則反射的時候方法不會被執(zhí)行。
  • 事件的類必須是bean,否則切面失敗。
  • 監(jiān)聽方法和(被監(jiān)聽方法)事件方法的參數(shù)數(shù)量,類型,順序必須一致,否則可能導(dǎo)致反射執(zhí)行方法失敗

核心源碼

@Around("@annotation(event)")
    public Object addEventListener(ProceedingJoinPoint joinPoint, AddEventAop event) throws Throwable {
        Object[] args = joinPoint.getArgs();
        //存儲需要在方法執(zhí)行之后再執(zhí)行的類
        List<Method> afterEventMethod = new ArrayList<>();
        //反射獲取AddEventListener修飾的方法并執(zhí)行
        //獲取自定義注解的配置
        final Map<String, Object> beans = applicationContext.getBeansWithAnnotation(AddEventAop.class);
        for (String key : beans.keySet()) {
            //Spring 代理類導(dǎo)致Method無法獲取,這里使用AopUtils.getTargetClass()方法
            Object o  = beans.get(key);
            Class<?> aClass = beans.get(key).getClass();
            String name = aClass.getName();
            //aop切面會導(dǎo)致方法注解丟失,在這里處理獲取原類名
            if (name.contains("$$")){
                String[] names = name.split("\\$\\$");
                name=names[0];
                aClass = Class.forName(name);
            }
            Method[] methods = aClass.getMethods();
            for (Method method : methods) {
                //獲取指定方法上的注解的屬性
                AddEventListener annotation = method.getAnnotation(AddEventListener.class);
                if (annotation!=null){
                    //執(zhí)行所有的注解了該類的方法
                    EventType value = annotation.value();
                    if (value.equals(EventType.BEFOREEVENT)){
                        method.invoke(o, args);
                    }else{
                       afterEventMethod.add(method);
                    }
                }
            }
        }
        //執(zhí)行被切面的方法
        Object proceed = joinPoint.proceed(args);
        //執(zhí)行需要在方法執(zhí)行之后再執(zhí)行的方法
        for (Method method : afterEventMethod) {
            Class<?> aClass = method.getDeclaringClass();
            Object o = aClass.newInstance();
            method.invoke(o, args);
        }
        return proceed;
    }

源碼地址

Github項目地址

到此這篇關(guān)于SpringBoot利用切面注解及反射實現(xiàn)事件監(jiān)聽功能的文章就介紹到這了,更多相關(guān)SpringBoot事件監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的BufferedInputStream與BufferedOutputStream使用示例

    Java中的BufferedInputStream與BufferedOutputStream使用示例

    BufferedInputStream和BufferedOutputStream分別繼承于FilterInputStream和FilterOutputStream,代表著緩沖區(qū)的輸入輸出,這里我們就來看一下Java中的BufferedInputStream與BufferedOutputStream使用示例:
    2016-06-06
  • Java實現(xiàn)解析ini文件對應(yīng)到JavaBean中

    Java實現(xiàn)解析ini文件對應(yīng)到JavaBean中

    ini 文件是Initialization File的縮寫,即初始化文件,是windows的系統(tǒng)配置文件所采用的存儲格式。這篇文章主要介紹了通過Java實現(xiàn)解析ini文件對應(yīng)到JavaBean中,需要的可以參考一下
    2022-01-01
  • SpringCloud Feign遠程調(diào)用與自定義配置詳解

    SpringCloud Feign遠程調(diào)用與自定義配置詳解

    Feign是Netflix公司開發(fā)的一個聲明式的REST調(diào)用客戶端; Ribbon負載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時出現(xiàn)的,而且配置也都非常相似
    2022-11-11
  • 詳解Java8新特性如何防止空指針異常

    詳解Java8新特性如何防止空指針異常

    要說 Java 編程中哪個異常是你印象最深刻的,那 NullPointerException 空指針可以說是臭名昭著的,不要說初級程序員會碰到, 即使是中級,專家級程序員稍不留神,就會掉入這個坑里,本文就和大家聊聊Java8新特性如何防止空指針異常
    2023-08-08
  • Java流操作之?dāng)?shù)據(jù)流實例代碼

    Java流操作之?dāng)?shù)據(jù)流實例代碼

    這篇文章主要介紹了Java流操作之?dāng)?shù)據(jù)流實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • springboot?yml配置文件值注入方式

    springboot?yml配置文件值注入方式

    這篇文章主要介紹了springboot?yml配置文件值注入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java 使用多線程調(diào)用類的靜態(tài)方法的示例

    Java 使用多線程調(diào)用類的靜態(tài)方法的示例

    這篇文章主要介紹了Java 使用多線程調(diào)用類的靜態(tài)方法的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • java webApp異步上傳圖片實現(xiàn)代碼

    java webApp異步上傳圖片實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了java webApp異步上傳圖片實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • SpringBoot全局處理統(tǒng)一返回類型方式

    SpringBoot全局處理統(tǒng)一返回類型方式

    這篇文章主要介紹了SpringBoot全局處理統(tǒng)一返回類型方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java利用序列化實現(xiàn)對象深度clone的方法

    Java利用序列化實現(xiàn)對象深度clone的方法

    這篇文章主要介紹了Java利用序列化實現(xiàn)對象深度clone的方法,實例分析了java序列化及對象克隆的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論

松江区| 宣化县| 安平县| 兴海县| 黑水县| 高台县| 井陉县| 祁门县| 额尔古纳市| 丽水市| 股票| 南汇区| 隆化县| 汝州市| 肥城市| 武冈市| 丽水市| 延长县| 彭阳县| 安西县| 东平县| 观塘区| 双江| 包头市| 奎屯市| 玉田县| 镇平县| 浦县| 洞口县| 台中县| 赤壁市| 内乡县| 申扎县| 尤溪县| 阳东县| 漳平市| 从江县| 额尔古纳市| 阿拉善右旗| 庆城县| 行唐县|