软件与容器

来源:互联网 发布:淘宝职业买手怎么赚钱 编辑:程序博客网 时间:2024/05/22 01:27

程序的时空

之前有文章说过,软件是模拟现实的时空。一个程序能够运行,首先是因为它存在于一个空间里面,这个空间提供给程序在时间上变化的基本条件。本文将以容器这个角度来讲述一下程序的时空概念。

容器是一个环境

容器提供程序运行的环境。程序是按时间顺序来改变容器中的环境或者改变其它容器环境的过程。没有程序的容器,通常就是存储。如数据文件。数据文件通常需要一个有程序的容器来改变。

上图显示程序可以改变的容器环境,要么是自身的容器环境,要是其它的容器环境。其它的容器环境,可能是一个程序,也可能是一个文件。但无论是什么,要改变其它容器的环境,都需要当前的容器对其输出数据。与些同时,被输出的容器得到的就是一个输入数据。

#include <stdio.h>int main(){  int i = 0;  char line[1024];  FILE *ofp = fopen("out.txt", "w");  FILE *ifp = fopen("in.txt", "r");  fgets(line, 1024, ifp);  while (!feof(ifp) && !ferror(ifp)) {    fprintf(ofp, "%d\t%s", ++i, line);    fgets(line, 1024, ifp);  }  fclose(ifp);  fclose(ofp);}

以上代码一旦运行,就构成一个容器。该容器中由一个存放整型数据的容器,一个可以存放1024个字节的容器加上两个可以保存对文件引用的两个容器组成。

该程序从 in.txt 这个容器中一行一行地获取数据,然后将每一行数据加上行号,将数据输出到 out.txt 这个容器中。在这个过程中,程序所在的容器,其内部环境也在变化,如 line 的内容在不断地改变,i 的内容也同样在不断地增加它的数值。

这一段代码体现了如何改变容器本身的环境以及如何改变容器外部的环境。在我们学习一种程序语言的时候,主要就是学习如何通过程序来改变容器内及容器外的环境。一般情况下,要改变窗口外的环境,程序无法去控制其它的容器,只能对其它的容器输出数据。同时,一个容器也要能够接受一个输入,这个输入是另外一个容器的输出。那么,学习一种语言,可以归结为:

  1. 如何利用语言操作语言支持的数据
  2. 如何利用语言操作输入流与输出流

对于第二点,需要知道通过什么样的方式来取到输入流与输出流。除了文件,还可以通过 socket 来得到输入流或者输出流。

分析 Tomcat

通过上面的描述,就可以很肯定地断言,当运行一个 Tomcat 服务的时候,就已经启动了一个容器环境。

Tomcat 是一个运行 Servlet 的容器。也就是说,一个 Tomcat 运行起来之后,Tomcat 需要装载一个或者多个 Servlet 对象

通过配置,当外界以 HTTP 协议请求的时候,Tomcat 根据请求的 URL 与配置文件匹配,然后交由 Servlet 来处理对应的 HTTP 请求。处理完请求之后,将结果响应给外界。

这样的逻辑非常简单:Tomcat 就是一个容器,该容器通过外界的输入来尾迹自身并将自身的数据作为输出流响应给外界。

在此解除一下很钻牛角尖的人的疑惑,有人会说,如果 Servlet 只是响应一个数字给输出流,那它的自身不就没有任何改变么?那么,所谓的改变,就是通过时间来改变容器的任何一个数据。这样说来,除非一个请求提交到 Tomcat,Tomcat 没有耗费任何时间就将数据返回给客户端。Tomcat 不耗费时间是不可能的。除非 Tomcat 死掉了。再说,响应一个数字,就已经在环境中构造了一个数字,那实际上已经让 Tomcat 环境改变了。

分析 Spring

如今 Spring 很流行,它的基本思想与 Tomcat 是一致的。但它的好处在于,Spring 整个容器可以放在任何地方运行,不需要依赖于 Tomcat ,而只依赖于 JVM。当然,Spring 为了做到这一点,也是做了很多工作的。如,它提供了一个 Servlet,当要在 Servlet 上运行的时候,可以用 Spring 所提供的 Servlet 作为基础层来隔离 Spring 容器 与 Tomcat 容器。

Spring 通过配置文件构造出各个类,并将各个类的依赖关系设置好。这样就构造出一个能够提供强大功能的整体。其它的程序可以有效地与该整体进行数据交互。

在没有 Spring 的年代,如果要做出一个整体并且统一的服务,那是需要程序员去构造出一个个的类,并将各个类的状态设置正确,再提供接口的一层接口给外界。这样,程序员花费了大量时间处理非业务相关的事情。Spring 的出现,让程序员将更多的精力放在业务数据的处理上,这样节约了项目整体的时间。

在程序员开发完一个基于 Spring 的项目之后,把这个 spring 的配置与容器带到任何一个任何一个环境都是没有问题。比如,开发了一个销售系统。可以把容器放在 web 容器中(Tomcat),用户通过浏览器来改变窗口环境;把容器放在 swing 中,用户通过 applet 来改变窗口环境;把容器放在 EBJ 中,用户可以通过 RPC 来改变容器环境。就单是放在 web 容器中,又可以放在 Servlet 里,放在 struts 之后,放在 Spring MVC 之后等多种情况。

从中可以看到,容器这样的概念,一旦正确的理解和应用,将会有利于将问题分解,从而提供高质量,高复用性的零件、部件。这是在程序上解决高效开发的一种途程。


原创粉丝点击