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

背景

项目组同事写了一个关于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的值即为在配置文件中配置的值,然后在进行自己的业务处理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容