美文网首页
实现自定义注解中变量的解析--StringValueResolv

实现自定义注解中变量的解析--StringValueResolv

作者: 酱油瓶儿_fea9 | 来源:发表于2021-10-11 21:41 被阅读0次

    背景

    项目组同事写了一个关于TDMQ的组件实现了类似KAFKA的@KafkaListener的功能,我们暂时就把注解称为@TdmqHandler。目前存在的问题是我们本地开发环境和测试环境使用的同一套TDMQ导致本地会消费测试环境的TDMQ的数据,因为我们想配置一个变量,然后通过启动命令来将这个TDMQ的消费者关闭。

    解决方案

    1.通过Environmnet来在处理@TdmqHandler时读取变量进行处理(总觉得不是很优雅)

    我们写了一个ConsumerListenerPostProcessor类来处理@TdmqHandler注解,该类实现了BeanPostProcessor接口,可以在postProcessAfterInitialization()方法中判断Bean是否注解了@TdmqHandler,如果存在,则创建TDMQ消费者。
    因此我在创建TDMQ消费者之前,通过environment获取环境变量tdmq.enable属性,String tdmqEnable = environment.getProperty("tdmq.enable"),然后根据tdmqEnable的值决定是否启动TDMQ的消费者,至于如何在ConsumerListenerPostProcessor中获取到environment变量呢,需要该类实现EnvironmentAware接口实现setEnvironment(Environment environmnet)接口即可。
    

    2.在@TdmqHandler中添加开关字段,通过启动命令来控制字段的值来达到目的

    因为总感觉上述方式不太优雅,因此我想在注解@TdmqHandler中添加一个字段比如enable然后使用变量的形式来控制它的值,实现效果@TdmqHandler(enable="${tdmq.enable}")。
    
    我们在ConsumerListenerPostProcessor中找到带有@TdmqHander注解的Bean,然后获取注解中enable的值,即字符串"${tdmq.enable}",接下来我们可以借助Spring的StringValueResolver来进行解析,ConsumerListenerPostProcessor需要使用EmbeddedValueResolverAware接口并实现setEmbeddedValueResolver(StringValueResolver resolver)方法
    
    String enableValue = stringValueResolver.resolveStringValue("${tdmq.enable}") 
    

    获取到的enableValue的值即为在配置文件中配置的值,然后在进行自己的业务处理

    相关文章

      网友评论

          本文标题:实现自定义注解中变量的解析--StringValueResolv

          本文链接:https://www.haomeiwen.com/subject/fceroltx.html