看我如何巧妙利用反射解决微信公众号接口分发
干货点:如何巧妙应对微信公众号开发只提供一个服务器地址?不如来看看我如何巧妙使用反射解决该问题吧!
最近被女朋友要求开发一个微信公众号专门记录点日常聊天内容和照片,求生欲极强的我趁着周末有空,拿起了微信开发相关的文档捣鼓了一下,目前已经搞定了,效果如下
image当然了我不是来这里秀恩爱的
image主要想趁热聊点有趣的东西,说说看我这边是如何利用反射进行接口分发的。
我们都知道在微信公众号服务器配置设置了我们的服务器地址后
无论关注的人怎么搞公众号,微信都是通过这个地址通知我们的服务器,也就是说我们服务器和微信公众号的交互只有这一个入口,那么怎么将微信发过来的数据包做不同的事件处理也就是我们开发者必须要处理的地方了,我这里结合在公司做游戏开发时用到的协议分发机制,自己搞了一套分发机制,且听我慢慢道来,首先
imageimage
这里我们可以看到realAction中是通过微信发过来的数据包拿到对应的FunctionTypeEnum,也只是getFunctionTypeEnum方法,这个是我自定义的一个枚举,主要是放各个功能的,最后再调用invoke真正实现各个功能的逻辑,我们可以看看枚举FunctionTypeEnum
image其实就是各个枚举自己实现一个isMatch接口,自己进行判断是否是对应的操作
现在看看invoke方法
我们可以看到是通过了一个ScanActionIdProcessor内的一个map拿到对应的Action,然后再通过反射进行实现的,这里就是相对有趣的地方了,我们可以看看这里边我是怎么实现的
进到ScanActionIdProcessor内看看对应的actionMap是什么
可以看到该类继承了InstantiationAwareBeanPostProcessorAdapter,这个我大概讲下,有兴趣可以看我之前的文章https://mp.weixin.qq.com/s/2V3VmESwUWEDltPJJlaXBA,我们可以理解成就是在项目启动的时候spring在扫其根目录下每个类后都会去专门的调用一下继承了InstantiationAwareBeanPostProcessorAdapter的类的postProcessAfterInitialization接口,理解了这一个后我们可以看到我这里会对对应类下的每个方法判断是否加上了注解ActionIdAnno,这个是我专门加的注解,也就是
image之后再将拿到这个注解内的FuntionTypeEnum,然后再将该对象和该方法组装成一个Action后放入actionMap中,也就是说后面只要我们拿到了对应的FuntionTypeEnum枚举,就可以通过这个actionMap拿到对应的对象和方法了,再通过反调就可以实现对应的逻辑了。
接下来看看该注解又是在哪里用以及怎么用的
image是的,就是这么简单,通过该枚举就实现了将枚举和接口绑定了。
总结一下就是服务器在启动的时候先通过InstantiationAwareBeanPostProcessorAdapter筛选出所有使用了ActionIdAnno注解的方法,将对应对象和方法封装后以对应枚举为key放入map中,之后服务器在接收到微信数据包的时候先用枚举中的isMatch匹配出此次操作对应的枚举,再通过该枚举取出对应逻辑的对象和方法,然后通过反射调用对应逻辑,之后就
image当然了,我知道你们肯定有更骚的操作,不如留个言和我说说吧
有兴趣也关注一波
image