在如今的java领域,各种新技术,新工具层出不穷,一方面,每一种技术都会不停的升级换代,另一方面,还会不断涌现出新的技术和工具。java世界就像小时候玩的万花筒,尽管实质上只是由几个普通的玻璃碎片组成,但只要轻轻一摇,就会变化出千万种缤纷的图案。java世界如此变化多端,很容易让初学java的人有无从下手的感觉。常常会有读者问我这样的问题:
我学了java已经一年多了,现在就只能用jsp写点东西,其它的东西实在太多了,我整天学都学不完,很迷惘,不知道该如何有针对性地去学,去找到一份java工作,现在是困死在java里了。
撰写本文,目的是为了帮助读者看清java万花筒的本质,从复杂的表象中寻找普遍的规律,只有掌握了普遍的规律,才能以不变应万变,轻轻松松的把握java技术发展的新趋势,迅速的领略并且会熟练运用一门新的技术,而不成为被动的追随者,知其然而不知其所以然。在寻找普遍规律之前,让我们先看看java的发展历程:
(1)sun的主流技术的发展
gui界面:java awt api--〉java swing api
javaweb: servlet--〉jsp--〉jsf
持久化层:jdbc--〉cmp ejb或bmp ejb或jdo
分布式应用:socket--〉rmi--〉j2ee或java web service
(2)主要java开源软件的种类
javaweb容器: tomcat、resin
ejb容器: jboss
框架: java web框架(struts)、业务逻辑层框架(spring)
持久化层: dao、orm映射工具(如hibernate、ojb)
工程管理工具:ant、elipse
日志输出工具: log4j
javaweb服务工具:apache axis
促成java世界如此绚丽多姿的基本动力在于以下核心思想:
接口与实现
不同的软件系统之间通过接口来交互。软件系统只对外公开接口,封装实现细节。接口描述了软件系统具备的功能,也就是指定软件系统能够做什么,但是没有指明怎么去做。接口具有三大作用:
(1)对于接口制订者:sun公司通过定义接口,来制定新的软件系统的规范,例如servlet规范、ejb规范和jdo规范,这些规范主要以接口的形式描述了软件系统必须具备的功能。通过制定规范,sun公司指引着java技术的发展方向,同时给接口的实现者提供了自由发挥的广阔空间。
(2)对于接口实现者:接口实现者以特定的方式实现标准的规范。例如一些开放源代码软件,如tomcat和resin分别以不同的实现方式,实现了标准的servlet规范。同一个接口允许有多种实现,使得java领域保持着百花齐放、百家争鸣的良好势头。
(3)对于接口调用者:接口调用者的程序具有良好的可移植性。以javaweb应用为例,由于tomcat和resin遵守同样的规范,因此用户开发的javaweb应用能够顺利的从tomcat容器移植到resin容器中。
封装与抽象
封装指的是在一个大系统中包含一个小系统,大系统是建立在已有小系统的基础上的更为复杂、功能更强大的系统。例如,hibernate对jdbc api进行了封装,在hibernate内部依赖jdbc api来操纵数据库,但是hibernate api比jdbc api具有更强大的功能,例如jdbc api只具有连接和操纵数据库的功能,而hibernate不仅具备这一功能,还具有对象-关系映射的功能。
抽象是指从已经存在的具有相似功能、但不同接口的系统中抽取共性,提炼出统一的接口。例如,hibernate transaction api是对jdbc transaction api和java transaction api(jta)的抽象。
继承与扩展
继承与扩展是一对孪生兄弟,当两个类之间存在继承关系,那么必定也存在扩展关系。继承的优点在于提高代码的可重用性,子类会继承父类的所有public和protected类型的属性和方法,在子类的程序代码中,无需重复定义这些属性和方法。扩展的优点在于使软件应用具有可伸缩性,能够在已有功能的基础上扩展新的功能。
struts框架充分运用了扩展思想。struts框架中的许多类都是供应用程序扩展的,其中最主要的一个是action类,在action类中已经定义了一些通用的方法,采用struts框架的javaweb应用将扩展action类,创建负责特定流程或业务的客户化的action类。
对象的生命周期
当一个对象通过new语句创建后,它就会拥有一块固定的内存空间,如果没有任何变量引用它,它就会结束生命周期,它占用的内存空间随时可能被jvm的垃圾回收器回收。
应用程序如何管理对象的生命周期呢?目前比较流行的做法是把对象存放在一个"范围"内。例如在javaweb应用中,javabean可以存放在request、session或application范围内。每个范围对应一个对象,例如request范围对应httpservletrequest对象,session范围对应httpsession对象,application范围对应servletcontext对象。
把一个javabean存放在request范围内,实质上是在httpservletrequest对象的一个集合属性中加入这个javabean的引用,这个集合属性也被称为httpservletrequest对象的缓存。
把一个javabean存放在request范围内,等价于以下两种说法:
把一个javabean加入到httpservletrequest对象的缓存中
把一个javabean和httpservletrequest对象关联
当javabean位于request范围内,这个javabean的生命周期依赖于httpservletrequest对象的生命周期,当httpservletrequest对象结束生命周期,并且这个javabean也不被应用程序中的其他变量引用,那么它就会结束生命周期。
那么httpservletrequest对象本身的生命周期由谁管理呢?这是由javaweb容器(也称servlet容器)来管理的。对于每个http请求,javaweb容器会自动创建一个httpservletrequest对象,当http请求的响应完毕,javaweb容器就会结束这个对象的生命周期。
同理,当每个http会话开始,javaweb容器会自动创建一个httpsession对象,当这个会话结束,javaweb容器就会结束这个对象的生命周期;当每个javaweb应用启动时,javaweb容器会自动创建一个servletcontext对象,当这个应用被关闭,javaweb容器就会结束这个对象的生命周期。
在hibernate中,在net.sf.hibernate.session范围内加入一个持久化对象,实质上是在session对象的集合属性中加入这个持久化对象的引用。以下几种说法是等价的:
在session范围内加入一个持久化对象
在session的缓存中加入一个持久化对象
把一个持久化对象与session关联
值得注意的是,hibernate的session不仅能管理缓存中持久化对象的生命周期,还会负责按照持久化对象的状态的变化,来同步更新数据库。
集成开源软件的基本步骤
在开发java应用时,为了提高开发效率,缩短开发周期,常常需要集成第三方提供的java软件,如orm映射工具hibernate、mvc框架struts、日志工具log4j和web服务软件apache axis等。在自己的应用中集成这些第三方软件时,大体步骤都很相似。
(1) 把它们的jar文件拷贝到classpath中。
(2) 创建它们的配置文件(xml格式的文件或者java属性文件),这些配置文件通常也位于classpath中。
(3) 在程序中访问它们的接口。
接口与配置文件,是软件系统对外公开的两个主要窗口。无论是tomcat、struts还是hibernate,都离不开配置文件,与编写程序代码相比,配置文件能提高软件的可维护性,更加灵活的适应用户变化的需求,但是,配置文件不擅长表达非常复杂的逻辑,在这种情况下,必须求助于程序代码。
作为软件使用者,如果仅仅想快速掌握一个新的java软件的使用方法,而不打算深入了解软件内在原理和结构,无非就是了解它的接口以及配置文件的使用方法。当然,如果想对软件的运用达到得心应手的地步,还应该了解软件本身的实现原理和结构,而这些软件无非就是通过抽象、封装和实现等手段,从简单的小系统出发,构造出更加复杂,但是对外有着简洁统一的接口的大系统。
闽公网安备 35060202000074号