Chinaunix首页 | 论坛 | 博客
  • 博客访问: 685414
  • 博文数量: 845
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 5015
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:22
文章分类

全部博文(845)

文章存档

2011年(1)

2008年(844)

我的朋友

分类:

2008-10-15 16:36:47

    2006 年底,Sun 公司发布了 Standard Edition 6( SE 6)的最终正式版,代号 Mustang(野马)。跟 Tiger(Java SE 5)相比,Mustang 在性能方面有了不错的提升。与 Tiger 在 API 库方面的大幅度加强相比,虽然 Mustang 在 API 库方面的新特性显得不太多,但是也提供了许多实用和方便的功能:在 脚本,XML 和 Web 服务,编译器 API,数据库,JMX,网络 和 Instrumentation 方面都有不错的新特性和功能加强。

    本系列 文章主要介绍 Java SE 6 在 API 库方面的部分新特性,通过一些例子和讲解,帮助开发者在编程实践当中更好的运用 Java SE 6,提高开发效率。本文是系列文章的最后一篇,主要介绍了 Java SE 6 中提供的 XML 处理框架,以及在此框架之上结合注释(Annotation) 技术,所提供的强大的针对 Web 服务的支持。

    Java SE 6 做为一个开发平台,针对不同的应用开发需求,提供了各种各样的技术框架。XML 处理框架是 JDK 6 的重要组成部分之一。它为应用程序开发人员提供了一个统一的 XML 处理 API。这种框架结构有两个作用:一方面,开发人员透过这些框架,可以透明的替换不同厂商提供的 XML 处理服务;另一方面,服务提供商可以透过这些框架,将自己的产品插入到 JDK 中。这种框架一般被称为 Service Provider 机制。Java SE 6 的 XML 处理功能分为两个部分:XML 处理(JAXP)和 XML 绑定(JAXB)。在 XML 处理框架之上,Java SE 6 结合了注释(Annotation)技术,提供了强大的针对 Web 服务的支持。

    本文首先介绍 Service Provider 机制及其在 XML 框架中的应用。然后介绍 Java SE 6 中 XML 框架的功能,包括 SAX,StAX,DOM 三种机制。最后介绍在此基础之上构建 Web 服务的技术。JAXB 和 Web 服务的开发关系紧密,故 JAXB 的介绍也放在 Web 服务部分介绍。本文内容基于 Java SE 6 SDK。

    Service Provider 机制

    对于同一个功能,不同的厂家会提供不同的产品,比如不同品牌的轮胎、插头等。在软件行业,情况也是如此。比如,对于数据的加密解密,不同的厂家使用不同的算 法,提供强度各异的不同软件包。应用软件根据不同的开发需求,往往需要使用不同的软件包。每次更换不同的软件包,都会重复以下过程:更改应用软件代码 -> 重新编译 -> -> 部署。这种做法一般被称为开发时绑定。这其实是一种比较原始的做法,缺乏灵活性和开放性。于是应用运行时绑定服务提供者的做法流行开来。具体做法是,使用 配置文件指定,然后在运行时载入具体实现。Java SE 平台提供的 Service Provider 机制是折衷了开发时绑定和运行时绑定两种方式,很好的满足了高效和开放两个要求。

    构成一个 Service Provider 框架需要大致三个部分,图 1 给出了一个典型的 Service Provider 组件结构。Java SE 平台的大部分 Service Provider 框架都提供了 3 个主要个组件:面向开发者的 Application 接口,面向服务提供商的 Service Provider 接口和真正的服务提供者。


图 1. Service Provider 的组件结构

图 1. Service Provider 的组件结构


    这样做的主要好处包括:

  1. 提供了供应商的中立性,应用代码与服务提供商完全独立,互不依赖。应用程序开发者针对 图 1 中 Application 接口进行开发。这个接口将不同提供商的接口差异性屏蔽掉了。无论使用哪个厂商的服务,应用程序都是针对一个稳定、统一的接口开发,业务逻辑和第三方组件之间有很强的独立性。如果有需要,应用程序可以针对不同提供商重新部署。清单 1 显示某应用程序中的一段代码。



    清单 1. 通过统一应用程序接口获得服务
                            
    SAXParserFactory factory = SAXParserFactory.newInstance();
    System.out.println(factory.getClass());

    // Parse the input
    SAXParser saxParser = factory.newSAXParser();
    System.out.println(saxParser.getClass());

    Output: class org.apache.xerces.jaxp.SAXParserFactoryImpl
    Output: class org.apache.xerces.jaxp.SAXParserImpl

    本例中 saxParser 的类型被声明为 SAXParser,但实际类型如 清单 1 中显示,为 org.apache.xerces.jaxp.SAXParserImpl。实际类型是由 SAXParserFactory 的静态方法 newInstance 查找配置文件,并实例化得到的。图 2 展示了 Java SE 6 中 XML 包的 Service Provider 的交互细节。请参考 Apache Hony 项目的具体代码(参见 参考资源)。



    图 2. XML 包的 Service Provider 结构
    图 2. XML 包的 Service Provider 结构

  2. 提供了扩展性,更多的服务可以加入开发平台;为了便于不同的开发商开发各自的产品,Java SE 平台同时为服务提供商设计了统一的接口。只要提供者满足这些接口定义(比如继承某个接口,或者扩展抽象类),服务提供者就能被添加到 Java SE 平台中来。以 图 2 给出的结构为例,服务提供者需要继承 SAXParserFactory、SAXParser 等抽象类,同时将类 VendorSaxParserFactoryImpl 的名字注册到 jaxp.properties 文件中,就可以被使用了。

  3. 兼 顾了灵活性和效率。通过这种方式,一方面组件提供者和应用开发者开发时绑定到一个约定的接口上,另一方面载入具体哪个组件则是在运行时动态决定的。不同于 Web 服务等技术的完全动态绑定(通过运行时解析 WSDL 文件来决定调用的类型),也不是完全的编码时绑定,这种折衷的方式提供了松耦合、高扩展性,同时也保证了可接受的效率。

[1]        

【责编:Chuan】

--------------------next---------------------

阅读(318) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~