www.oschina.net/question/2744623_2238825
类似这种的问题,总有一些新人朋友在问。这篇文章分享一下我所知道的思路。
我所想到的有4种解题方法:
第一种方式,最简单的方法就是写switch,两组switch嵌套,来分发消息到哪个类的哪个函数处理,具体就不多解释了,显然这不是我们想要的写法。
第二种方式,使用XML配置判断消息去哪个类来处理,到处理的具体类里面还是写switch来判断去哪个函数处理。
上图的XML配置是我之前做的项目里用的,去哪个类来处理消息,使用该配置文件,在服务器启动的时候根据XML反射创建处理类对象,然后在某个具体类里面处理消息还是使用的switch来判断。显然这种也不是我们想要的处理方式,能不能更优雅一点,比如整成类型SpringMVC那样的操作方式,在类和函数分别上面加上注解来处理消息的分发呢?答案是可以的。
第三中方式,借助spring自定义注解来实现消息的分发,类似SpringMVC的处理方式。
实现BeanPostProcessor接口,在Bean初始化后对其进行扫描,找出大小协议号。
使用就和SpringMVC的方式类似了,在接口和函数上分别添加注解。
完整代码:
git.oschina.net/Spirit_wolf/chat_netty4
上面使用Spring的方式使用反射可能在内存性能方面的问题。
第四种方式,使用JDK8的method reference新特性,性能上可能比第3种方式好,但是开发效率上没第3种方式方便。
interface Handler{
void handler(ISession session, IByteBuffer data);
}
Map map
map.put(CREATE, this::createRole)