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

Spring?代理?Bean?獲取不到原始?Bean?對(duì)象注解解決方法

 更新時(shí)間:2022年04月22日 09:42:10   作者:心城以北  
這篇文章主要介紹了Spring?代理?Bean?獲取不到原始?Bean?對(duì)象注解解決方法,文章圍繞主題相關(guān)資料展開(kāi)詳細(xì)介紹,需要的小伙伴可以參考一下

一、問(wèn)題描述

在接受 mq 消息的時(shí)候,需要做一個(gè)重試次數(shù)限制,如果超過(guò) maxNum 就發(fā)郵件告警,不再重試。 所以我需要對(duì) consumer 對(duì)象進(jìn)行代理,然后如果超過(guò)異常次數(shù),我直接返回成功,并且發(fā)送成功消息,但是我獲取 consumer handler 方法的方式是通過(guò) method.getAnnotation(XXClient.class) 方式,那么就會(huì)返回 null。

1.問(wèn)題示例代碼

  • 目標(biāo)類, 我這里就之定義一個(gè) test 方法,里面做一些個(gè)簡(jiǎn)單的打印。
@Component
public class TestBean {

    @Anno
    public void test() {
        System.out.println("test .....");
    }
}
  • 代理邏輯邏輯處理, 主要就是做一個(gè) @Around 的方法覆蓋,保證在調(diào)用目標(biāo)方法之前,先輸出我插入的邏輯。
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {

    String key() default "100%";
}

@Aspect
@Component
public class AnnoAspect {

    @Around("@annotation(anno)")
    public Object anno(ProceedingJoinPoint point, Anno anno) throws Throwable {
        System.out.println("anno invoke!!!!!!");
        return point.proceed();
    }


}
  • 調(diào)用點(diǎn), 通過(guò) AnnotationConfigApplicationContext 獲取 bean. 然后通過(guò) getMethods() 獲取所有的方法,最后查找 Anno 注解的 Method 對(duì)象。
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanStart.class);
    TestBean bean = applicationContext.getBean(TestBean.class);

    Class<? extends TestBean> classz = bean.getClass();
    Method[] methods = classz.getMethods();

    for (Method m : methods) {
        Anno annotation = m.getAnnotation(Anno.class);

        if (annotation != null) {
            System.out.println(" ============= invoke test ===========");
            m.invoke(bean, new Object());
        }
    }    

由于 m.getAnnotaion(Anno.class) 無(wú)法獲取到注解信息,所以執(zhí)行 test 方法失敗, 到此問(wèn)題還原完畢,我們?cè)賮?lái)看看如何解決。

二、解決方案

通過(guò) Anno ao = AnnotationUtils.findAnnotation(method, Anno.class); 方法獲取即可。

有的代碼是這樣寫的 :

String name = classz.getName();
boolean isSpringProxy = name.indexOf("SpringCGLIB$$") >= 0;
Method[] methods;
if (isSpringProxy) {
    methods = ReflectionUtils.getAllDeclaredMethods(AopUtils.getTargetClass(bean));
} else {
    methods = classz.getMethods();
}

// 省略部分代碼
if (isSpringProxy) {
    annotation = AnnotationUtils.findAnnotation(method, MqClient.class);
} else {
    annotation = method.getAnnotation(Anno.class);
}

這里他會(huì)做一個(gè)判斷,如果是代理對(duì)象就調(diào)用 ReflectionUtils.getAllDeclaredMethods 獲取所有的方法, 然后再去拿注解的時(shí)候二次判斷一下,如果存在代理,那么就通過(guò) AnnotationUtils.findAnnotation 感覺(jué)是相當(dāng)?shù)膰?yán)謹(jǐn)。

總結(jié):

Spring 提供了非常強(qiáng)大的一站式開(kāi)發(fā)功能,而且還提供了比較優(yōu)秀的工具方法比如: BeanUtils 、ReflectionUtils 、AnnotationUtils 等,這些都是我們值得掌握的基礎(chǔ)工具類。

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)定時(shí)任務(wù)的三種方式小結(jié)

    SpringBoot實(shí)現(xiàn)定時(shí)任務(wù)的三種方式小結(jié)

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)定時(shí)任務(wù)的三種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java基礎(chǔ)知識(shí)精通各種運(yùn)算符

    Java基礎(chǔ)知識(shí)精通各種運(yùn)算符

    計(jì)算機(jī)的最基本用途之一就是執(zhí)行數(shù)學(xué)運(yùn)算,作為一門計(jì)算機(jī)語(yǔ)言,Java也提供了一套豐富的運(yùn)算符來(lái)操縱變量,本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2022-04-04
  • springAOP中用joinpoint獲取切入點(diǎn)方法的參數(shù)操作

    springAOP中用joinpoint獲取切入點(diǎn)方法的參數(shù)操作

    這篇文章主要介紹了springAOP中用joinpoint獲取切入點(diǎn)方法的參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java?DelayQueue實(shí)現(xiàn)任務(wù)延時(shí)示例講解

    Java?DelayQueue實(shí)現(xiàn)任務(wù)延時(shí)示例講解

    DelayQueue是一個(gè)無(wú)界的BlockingQueue的實(shí)現(xiàn)類,用于放置實(shí)現(xiàn)了Delayed接口的對(duì)象,其中的對(duì)象只能在其到期時(shí)才能從隊(duì)列中取走。本文就來(lái)利用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù),感興趣的可以了解一下
    2022-09-09
  • Java生成隨機(jī)數(shù)之Random與ThreadLocalRandom性能比較詳解

    Java生成隨機(jī)數(shù)之Random與ThreadLocalRandom性能比較詳解

    大家項(xiàng)目中如果有生成隨機(jī)數(shù)的需求,我想大多都會(huì)選擇使用Random來(lái)實(shí)現(xiàn),它內(nèi)部使用了CAS來(lái)實(shí)現(xiàn)。?實(shí)際上,JDK1.7之后,提供了另外一個(gè)生成隨機(jī)數(shù)的類ThreadLocalRandom,那么他們二者之間的性能是怎么樣的呢?本文就來(lái)詳細(xì)說(shuō)說(shuō)
    2022-12-12
  • SpringBoot配置文件bootstrap和application區(qū)別及說(shuō)明

    SpringBoot配置文件bootstrap和application區(qū)別及說(shuō)明

    這篇文章主要介紹了SpringBoot配置文件bootstrap和application區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 深入了解Java中的static關(guān)鍵字

    深入了解Java中的static關(guān)鍵字

    這篇文章主要為大家詳細(xì)介紹了Java中的static關(guān)鍵字的用法的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-11-11
  • 從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens

    從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens

    這篇文章主要為大家介紹了從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens刷新令牌示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • eclipse創(chuàng)建springboot項(xiàng)目的三種方式總結(jié)

    eclipse創(chuàng)建springboot項(xiàng)目的三種方式總結(jié)

    這篇文章主要介紹了eclipse創(chuàng)建springboot項(xiàng)目的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類的示例

    HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類的示例

    下面小編就為大家?guī)?lái)一篇HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類的示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10

最新評(píng)論

新津县| 长寿区| 富阳市| 崇义县| 庆元县| 张家界市| 涞水县| 齐河县| 密山市| 南充市| 股票| 桂东县| 曲阳县| 垦利县| 邵阳县| 监利县| 旬阳县| 玉溪市| 延川县| 邻水| 麻城市| 横峰县| 五大连池市| 固原市| 万山特区| 县级市| 蒲城县| 邓州市| 鄱阳县| 孟连| 玉林市| 弋阳县| 华池县| 花垣县| 怀柔区| 原阳县| 德兴市| 贵定县| 木兰县| 襄樊市| 鹤庆县|