软件项目整个架构分析说明 <?xml:namespace prefix = o />

前面我写了几篇有关在 jboss 上运行的 java 程序的小文章,今天没事翻回头看了看,感觉有点东西想说,可能很多朋友看了前面的几篇文章感觉有点不知所云。那就怪我没有说清楚吧。那些都是一点点感性上的认识,大家之所以看不明白不是看不懂某项技术,而是不知道这些都做什么用的。在后面我会写些有关 ejb3 的文章,今天这篇文章我要做个整体的说明,包括 ejb3 j2ee jsp servlet 之类的名词都将出现。这些名词之间的关系也是我要说的重点。
我不太喜欢全是文字,首先给大家一个图看看:
              图一       
       我用了一个简单的组件图来表示一个项目的整体内容。我们看到他们之间有包含、依赖、调用、同级等等关系。大家仔细看一下,在这个图上停一分钟,再看下面的文字,要是看不清楚的话,附件里面有个清楚的可以下下来看看。
       不知道大家看出点什么来了吗?要是没有就怪我没有画明白的吧,我现在来解释一下上面的图。首先我要明确一下我们看到是一个整个的项目,现在这个里面是 java 的,其实将里面技术做点变化的话 .net 项目也是差不多的。我先有 java 来说事情。大家都是大名鼎鼎的 mvc 框架,看看是不是有点像呢?我估计这个也是参照着 mvc 框架的灵感来的吧(这个纯属我个人观点)。对于整个项目而言,其实他就是由不同的部分组成的,我用组件图来画这个图就是出于这个理由,其实我们也可以转换一些名词来说,这样子是为了方便大家理解,比如说“ container ”。容器这个概念是个好东西,因为他十分的灵活,在软件架构设计中很多时候,都是在思考容器问题,在贴近代码点说的话叫做“ package ”。包的概念大家就很熟悉了吧,包的设计和规划是很多设计师最为头疼的问题了。哈哈,要是您觉得是话,我想我们是很有共同语言的。
       说了些名词上面的铺垫,我们回到上图来。我从宏观角度上来做说明。左边是显示部分、中间就是逻辑部分、右边是数据库部分了。
       显示部分中包含一些容器, ie 客户端、应用程序客户端、其他项目的接口端、 J2ME 的手机客户端程序之类的,他们是可以增减的,根据不同的项目我们需要的相关容器也是不同的。
       中间是我们的重点,也是在项目开发中工作量相对较大的部分,就是整个 J2EE 平台。我们熟悉的 jsp servlet ejb ,我在前面已经简单说过 jsp servlet (现在大家知道他们在整个项目中所在的位置了吧),他们在 J2EE 平台里是一个与显示端交互的容器,这个也是可以增减的,我们只用其中一种的话完全可以。 Ejb 容器是一个与显示端交互的容器同级的容器,他里面跑着整个 ejb3 的服务内容。现在被媒体炒得火热的 SOA ,就是如何在“这一层容器”内部,跑何种结构的服务的问题(之所以叫这一层容器是因为,我们现在在说 ejb3 ,但其实容器的概念是很广泛的, .net 里面或者 java 中的别的容器也可以按照 SOA 的理念来设计,我不希望朋友们只把他局限于 ejb3 )。在 ejb3 容器里面,在细一个层面的问题我们稍后再说。
       右边的数据库部分,就是我们所存储数据所用的数据库,他的作用就不细说了,做开发的都知道吧。
       上面的东西如果都看懂了的话我们来针对ejb3 进行下一步的微观
       前面说了中间的 J2EE 平台是我们这次说的重点。现在我将内容锁定到 J2EE 平台上面来。看上图,我们得知, ejb3 负责的工作就是将数据库中的数据拿到,做相关逻辑上面的组合或者拆分,将其包装成一个一个服务容器,以接口的形式暴露出去。 Jsp servlet 则是将这些服务以友好的界面形式告诉 ie 客户端,从而显示给最终用户。
       我们来看 ejb3 容器,如下图:
图二
现在我们进入相对刚才来说微观一点的 ejb3 容器里面了,在前面我们已经整个 ejb3 容器在项目中的位置。结合这个位置,我们看里面子容器(或者说子组件)是什么样子的。 Ejb3 容器在整个项目中呈现的作用是一个承前启后的作用,这个是根据他所在的位置决定的,位置决定功能嘛。
我们看到,在 ejb3 容器里,主要包含三种子容器 session bean driver manage bean entity bean
1、  session bean 对于上级(代码或者使用者)而言,就是提供一个同步的服务。
2、  driver manage bean 对于上级(代码或者使用者)而言,就是提供一个异步的服务。
3 entity bean 主要是为上面两种 bean 服务的,他的功能就是将数据库中的关系数据以一种对象的方式呈现出来,他的工作就是关系数据和对象数据的转化。其实现在也有一些很好很成熟的技术来做这个工作。比如: java 著名的 hibernate 技术(他的映射思想很完美的解决了这个问题,甚至很多别的技术都是用这种映射思想,比如说 jboss 中间件在很大程度上就是用了这个思想。还有我们这是说的 ejb3 和他前面的版本 ejb2 也很成功的使用了映射思想)、 .net 也有相对应的 nhibernate 技术。
上面的东西如果都看懂了的话我们来针对 ejb3 中的各个容器再进行下一步的微观。
我们都知道我们通过页面访问数据库也好、文件也好,主要是由两种方式访问的,一种是我在页面上点击后直接看到结果,也就是我们所说的及时同步响应。还有一种是我在页面上做一个操作,这个操作要是比较复杂的话可能不会即使的反应给我,但是我们也不能看着电脑干等着是吧,那么我们就将这个操作记录下来,放到后台做,我们可能现在不能马上等到结果,操作完成时会再此通知我们刚才的操作以完成,这就是非及时异步响应。那么我们在进行服务发布的时候也会针对这两种类型的响应设计相应的服务,即 Session bean Driver manage bean 。我们有了这两种 bean ,但是他现在还有一点不好就是和数据库打交道需要根据 E-R 连安排结构而不是能和对象打交道的这种方式,于是 entity bean 孕育而生。其实我们仔细想一下,这三种 bean 都不是凭空而来的,他们都是有根有据的。
Session bean 主要分成两类, stateless stateless 。有状态会话 bean 和无状态会话 bean 的区别主要在于有状态会话 bean 可以存放一些需要的信息。
Driver manage bean 主要分成 queue topic 两种。 Queue 是点对点消息, topic 是发布 / 部署消息。他们两者之间的主要区别在于消息发布方式的不同。
Entity bean 主要的工作室通过 O-R-mapping 技术来让上层使用对象数据而非 E-R 关系的数据。
以上文章我将开发软件项目的整个体结构进行了一个分析和解释,我相信大家已经对其有了比较详细的了解了。在以后的文章里我将会以 ejb3 为主体说下各个容器。还有一些与之层面上相关的架构。比如显示层主要用的 struts 架构,逻辑层主要用的 spring 架构,持久层主要用的 hibernate 架构。还有 ejb3 里面各个 bean ,以及 jms jca 等内容。