巧妙利用反射解决微信公众号接口分发

【干货点】 干货点:如何巧妙应对微信公众号开发只提供一个服务器地址?不如来看看我如何巧妙使用反射解决该问题吧!

最近被女朋友要求开发一个微信公众号专门记录点日常聊天内容和照片,求生欲极强的我趁着周末有空,拿起了微信开发相关的文档捣鼓了一下,目前已经搞定了,效果如下

当然了我不是来这里秀恩爱的

主要想趁热聊点有趣的东西,说说看我这边是如何利用反射进行接口分发的。
我们都知道在微信公众号服务器配置设置了我们的服务器地址后

无论关注的人怎么搞公众号,微信都是通过这个地址通知我们的服务器,也就是说我们服务器和微信公众号的交互只有这一个入口,那么怎么将微信发过来的数据包做不同的事件处理也就是我们开发者必须要处理的地方了

我这里结合在公司做游戏开发时用到的协议分发机制,自己搞了一套分发机制,且听我慢慢道来,首先


这里我们可以看到realAction中是通过微信发过来的数据包拿到对应的FunctionTypeEnum,也只是getFunctionTypeEnum方法,这个是我自定义的一个枚举,主要是放各个功能的,最后再调用invoke真正实现各个功能的逻辑,我们可以看看枚举FunctionTypeEnum

其实就是各个枚举自己实现一个isMatch接口,自己进行判断是否是对应的操作
现在看看invoke方法

我们可以看到是通过了一个ScanActionIdProcessor内的一个map拿到对应的Action

然后再通过反射进行实现的,这里就是相对有趣的地方了,我们可以看看这里边我是怎么实现的
来到到ScanActionIdProcessor内看看对应的actionMap是什么

可以看到该类继承了InstantiationAwareBeanPostProcessorAdapter,这个我大概讲下,有兴趣可以看我之前的文章Java&Spring系列笔记

我们可以理解成就是在项目启动的时候spring在扫其根目录下每个类后都会去专门的调用一下继承了InstantiationAwareBeanPostProcessorAdapter的类的postProcessAfterInitialization接口

理解了这一个后我们可以看到我这里会对对应类下的每个方法判断是否加上了注解ActionIdAnno,这个是我专门加的注解,也就是

之后再将拿到这个注解内的FuntionTypeEnum,然后再将该对象和该方法组装成一个Action后放入actionMap中,也就是说后面只要我们拿到了对应的FuntionTypeEnum枚举,就可以通过这个actionMap拿到对应的对象和方法了,再通过反调就可以实现对应的逻辑了。

接下来看看该注解又是在哪里用以及怎么用的

总结一下

其实就是服务器在启动的时候先通过InstantiationAwareBeanPostProcessorAdapter筛选出所有使用了ActionIdAnno注解的方法,将对应对象和方法封装后以对应枚举为key放入map中,之后服务器在接收到微信数据包的时候先用枚举中的isMatch匹配出此次操作对应的枚举,再通过该枚举取出对应逻辑的对象和方法,然后通过反射调用对应逻辑,之后就

当然了,我知道你们肯定有更骚的操作,不如留个言和我说说吧

[好好面试] 系列文推荐:

list中for循环删除多个元素为何报错?

你必须要懂的Spring-Aop之源码跟踪分析Aop

你必须要懂的Spring-Aop之源码跟踪分析Aop

你必须要懂的Spring-Aop之应用篇

你所不知道的HelloWorld背后的原理

连引用都答不上,凭什么说你是Java服务端开发

你是否了解Spring中bean的生命周期呢?

开发必学,io&nio

你所不知道的HelloWorld背后的原理

如何基于spring动态注册bean

拓展spring组件之自定义标签

基于spring实现事件驱动

Java日常干货

Java&Spring系列笔记

公众号主营:Golang、Java等服务端编程相关技术原创解说,具体可以看目录。
公众号副业:各种陪聊吹水,包括技术、就业、人生经历等等,欢迎一起侃大山。

▼更多精彩内容,请长按二维码▼

原创不易,觉得不错就点分享、在看,支持原创????

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值