资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
深入理解Apache Mina -Mina 的几个类Author:中國壹石頭- What wecallhuman nature is actually human habbit.深入理解 Apache Mina - Mina 的几个类最近一直在看 Mina 的源码,用了Mina 这么长时间,说实话,现在才开始对 Mina 有了一些 深刻的理解,关于 Mina 的基本知识的介绍,这里就不多说了,网上已经有很多不错的文章 都对Mina 做了较深刻的剖析, 现在就是想从Mina 的最根本的地方来对 Mina 做一些深层次 上的探讨。还是先从 Mina 的入口程序来说,每当要启动一个 Mina 的程序(包括服务器和客户端)时 候,这里只是对服务器重点做一些讲解,至于说 Mina 的客户端的应用,这里只是简单的涉 及一点, 不会对其做很深入的探讨。 但是Mina 的服务器和客户端在很大的程度上都是一样 , 所以这里就“挂一漏万”的简单讲解一下。在此之前我一直想找一种“串糖葫芦”的方式来讲解一下 Mina, 可是一直没有时间来看 Mina 的源码,真的是无从下手,虽然网上的很多关于 Mina 的一些文章,讲解的非常透彻了,但 是可能对于初学者来说,显得有些深奥,在这里特别的提一下洞庭散人对 Mina 源码的透彻 的分析,如果你对 Mina 已经有了一定的了解或者是正在学习 Mina 的源码,建议你去看看 他的博客,里面有很多东西讲的是相当到位的。在这里就不在多举例子了。写这篇文档主要 是想对刚接触 Mina 的人讲解一些 Mina 的基本知识,由浅入深,一步一步的学习 Mina 思想 的精髓,我接触 Mina 的时间也比较长了,几乎天天在和它打交道,每当你发现一个新奇的 用法的时候,你真的会被 Mina 所折服,我这里不是对 Mina 的吹捧,记得我曾经和同事开玩笑说,“等真正的懂得了 Mina,你就知道什么叫Java了”,所以,我现在想急切的把现在 所知道和了解的所有关于 Mina 的一些东西都想在这篇文章里面写出来,如果有写的不到位 的地方还请各位同学多多指正,下面就开始对 Mina 做一个完整的介绍。一、先说说Mina 的几个类和接口 (1)IoService (2)BaseIoService (3)BaseIoAcceptor (4)IoAcceptor (5)IoConnector这几个类和接口是整个服务器或客户端程序(IoConnector)的入口程序,其中就 Mina 的整体上来说,IoService 是所有IO通信的入口程序,下面的几个接口和类都是继承或者实现了 IoService 接口。深入理解Apache Mina -Mina 的几个类Author:中國壹石頭- What wecallhuman nature is actually human habbit.下面先给出 Mina(入口程序)的整体架构图:Mina 的整体架构图在这里先提出几个个问题: (1)为什么有了一个 IoService 还要再有一个 BaseIoService? (2)BaseIoService 和 IoAcceptor(IoConnector)有什么区别? (3)BaseIoAcceptor(BaseIoConnector)为什么不去直接实现 IoService,而是又添加了 IoAcceptor(IoConnector)?带着这几个问题我们来解读一下 Mina 的源码: 首先, 解答第一个问题, 为什么有了一个 IoService 还要再有一个 BaseIoService?IoService 和BaseIoService 最明显的区别就是 IoService是一个接口, 而BaseIoService是一个抽象类 。 BaseIoService 实现了IoService 中的部分方法。这里先把 IoService 接口中要实现的方法和BaseIoService 中实现的方法列举如下:深入理解Apache Mina -Mina 的几个类Author:中國壹石頭- What wecallhuman nature is actually human habbit.通过对IoService 和 BaseIoService 的比较可以发现,除了 getDefaultConfig()这个方法没有 在 BaseIoService 中实现之外,其他的方法都已经在 BaseIoService 实现了。这里就有一个 问题,为什么 BaseIoService 只是实现了IoService 的部分方法,而没有全部实现 IoService 的方法呢?通常都知道,接口中的方法是必须要由实现类来实现的,这点是毋庸置疑的。你 可以写一个空方法,里面没有任何的逻辑处理,但是你的实现类中却不能没有该方法。但是 在 Mina 中作为实现类的 BaseIoService 却没有 IoService 指定的方法getDefaultConfig(), 难道Mina 真的有独到之处?不是!仔细看看 BaseIoService 你就会知道,BaseIoService 是 一个抽象类,抽象类就是用来被继承的,它提供了一些其子类公用的一些方法,当抽象类实 现一个接口时,抽象类可以有选择性的实现其所有子类都需要的实现的一些方法, 对于接口 中指定法方法,抽象类可以选择全部实现或者部分实现。在Mina 中如果没有 BaseIoService 这个抽象类,而是由 BaseIoAcceptor和 BaseIoConnector 直接去实现 BaseIoService接口, 那么必然会导致这个两个实现类中都要重写相应的方法,这样就脱离了面向对象设计的本 质,没有达到复用的目的。在BaseIoAcceptor/BaseIoConnector和 BaseIoService 之间添加 一个BaseIoService 就是为了达到代码复用的目的。在这个问题上主要是要记住两点:1)抽象类在实现接口的时候可以部分或者全部实现接口中的方法。但是当抽象类只是实现了接口中的部分方法的时候,抽象类的子类必须要实现抽象类中未实现的接口的方法。在此处,IoService 的getDefaultConfig()方法在 BaseIoService(BaseIoAcceptor是 BaseIoService 的子类,但它也是一个抽象类,所以它也没有实现getDefaultConfig(),getDefaultConfig()是由 BaseIoAcceptor 的子类们来实现的(如SocketAcceptor,这是一个具体实现类)。所以接口的所有方法必须被具体的实现类实现和抽象类在实现接口的时候可以部分或者全部实现接口中的方法是不矛盾的。2)注意代码的重用。在面向对象的编程语言中都提供了抽象类和接口,抽象类和接口最大的区别就是抽象类提供了方法的具体实现,供其子类来调用;而接口只是提供了对方法的声明,其方法的实现要由其具体实现类来做。在 Java 中一个子类只能有一个父类,但是却能实现多个接口。个人认为接口和抽象类各有特色,接口的使用比较灵活,不同的接口可以让其子类扮演不同的角色,侧重于类的复用,在很大程度上解决了代码复用的问题;抽象类更侧重的是方法的复用,某种意义上讲,抽象类的使用对于程序来说使用起来更加轻松,但是是使用抽象类还是接口要根据具体的情况而定。对于接口和抽象类的具体的用法请参考闫宏的Java 与模式中相关部分的讲解。之所以在这里罗列这么些问题,目的不仅仅是为了讲解 Mina 的原理,而是想从一个高的角 度来看待的这个经典的开源项目,通过对 Mina 的学习和理解,能够真正的懂得什么是一个 项目,什么是面向对象编程,更本质的东西是怎么灵活运用 Java来达到上面的两个目的。 这个才是最重要的,哪怕是你在看完本文后对 Mina 的理解还是有点模糊,但是你至少要知 道在编写一个程序的时候怎样从面向对象的角度上去思考一个问题, 而不是在用着面向对象 的语言写着结构化的程序。这些东西都是自己做开发这么长时间的一些心得, 在这里总结出 来,目的主要是用于交流和学习,不是在卖弄,只是想让更多的初学者少走一些弯路,懂得 学习的方法。还是回到对 Mina 的刚提出的那几个问题上来,现在,第一个问题已经解决了,为什么有了 一个IoService 还要再有一个 BaseIoService?答案就是为了代码的复用。深入理解Apache Mina -Mina 的几个类Author:中國壹石頭- What wecallhuman nature is actually human habbit.其次,下面开始讨论第二个问题,BaseIoService 和 IoAcceptor(IoConnector)有什么区别? 在讨论这个问题之前,还是先给出这两个类(接口)提供的方法,如下图:在讨论第一个问题的时候我们已经看过了 BaseIoService 的方法了,但是没有对这些方法的 功能做些梳理,现在就对这些方法做些简单的介绍:getFilterChainBuilder()和setFilterChainBuilder():这两个方法主要是对一个服务的 IoFilter 的操作,关于 IoFilter 的详细介绍会在后面给出,现在你可以将其理解为是一个处理业务逻辑的模块,例如:黑名单的处理、数据的转换、 日志信息的处理等等都可以在这个IoFilter中实现,它的工作原理和Servlet中的过滤器很相似。addListener()和 removeListener():这两个方法通过名字看就可以理解了,就是给当前的服务添加和删除一个监听器,这个监听器主要是用于对当前连接到服务的 IoSession 进行管理,这个也会在后面做详细的讲解。getManagerServiceAddress()和 getManagerSessions():这两个方法的功能比较相似,一个是获取当前服务所管理的远程地址,一个是获取当前服务所管理的会话IoSession,IoSession 对 SocketAddress 做了一个完整的封装,你也可以先将这两个方法的功能理解为是一回事,具体的区别会在后面给出。isManaged():检测某个 SocketAddress 是否处于被管理的状态。getListeners():获取当前服务的监听器。看了上面对 BaseIoService 功能的介绍,现在我们可以理解 BaseIoService 提供的方法主要 是用于对当前服务的管理。那么要管理一个服务,前提条件是这个服务必须存在,存在的前 提是什么,就是要启动一个服务,或者是连接到一个远程主机上,这两个任务分别是 IoAcceptor 和IoConnector来完成的,此处要注意的是这两个对象都是接口,没有具体的实 现,具体的实现会
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号