日期:2014-05-17  浏览次数:20671 次

Apache Mina学习3

深入理解Apache Mina (1)---- Mina的几个类3 ]5 B# z5 @+ d' h# k8 m) I, e7 S! @4 b

  最近一直在看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' F. D8 q+ N( j. ?/ P- K8 K5 l
  (2) BaseIoService- X( m% R# A% J) H
  (3) BaseIoAcceptor
  (4) IoAcceptor
  (5) IoConnector
  这几个类和接口是整个服务器或客户端程序(IoConnector)的入口程序,其中就Mina的整体上来说,IoService是所有IO通信的入口程序,下面的几个接口和类都是继承或者实现了IoService接口。
  下面先给出Mina(入口程序)的整体架构图:



  在这里先提出几个个问题:
  (1)为什么有了一个IoService还要再有一个BaseIoService?
  (2)BaseIoService和IoAcceptor(IoConnector)有什么区别?
  (3)BaseIoAcceptor(BaseIoConnector)为什么不去直接实现IoService,而是又添加了( W( c/ O5 Y/ G7 f
  IoAcceptor(IoConnector)?
  带着这几个问题我们来解读一下Mina的源码:
  首先,解答第一个问题,为什么有了一个IoService还要再有一个BaseIoService?IoService和BaseIoService最明显的区别就是IoService是一个接口,而BaseIoService是一个抽象类。BaseIoService实现了IoService中的部分方法。
  这里先把IoService接口中要实现的方法和BaseIoService中实现的方法列举如下:- t: t) d# Q, I4 \4 {6 M$ j

?

通过对IoService和BaseIoService的比较可以发现,除了 getDefaultConfig()这个方法没有在BaseIoService中实现之外,其他的方法都已经在BaseIoService实现了。这里就有一个问题,为什么BaseIoService只是实现了IoService的部分方法,而没有全部实现IoService的方法呢?通常都知道,接口中的方法是必须要由实现类来实现的,这点是毋庸置疑的。你可以写一个空方法,里面没有任何的逻辑处理,但是你的实现类中却不能没有该方法。但是在Mina 中作为实现类的BaseIoService却没有IoService指定的方法getDefaultConfig(),难道Mina真的有独到之处?不是!仔细看看( n: D3 G4 U; |1 g2 n& q

  BaseIoService你就会知道,BaseIoService是一个抽象类,抽象类就是用来被继承的,它提供了一些其子类公用的一些方法,当抽象类实现一个接口时,抽象类可以有选择性的实现其所有子类都需要的实现的一些方法,对于接口中指定法方法,抽象类可以选择全部