第 17 章 使用Spring进行远程访问与Web服务

目录

17.1. 简介
17.2. 使用RMI暴露服务
17.2.1. 使用RmiServiceExporter暴露服务
17.2.2. 在客户端链接服务
17.3. 使用Hessian或者Burlap通过HTTP远程调用服务
17.3.1. 为Hessian和co.配置DispatcherServlet
17.3.2. 使用HessianServiceExporter暴露你的bean
17.3.3. 在客户端连接服务
17.3.4. 使用Burlap
17.3.5. 对通过Hessian或Burlap暴露的服务使用HTTP Basic认证
17.4. 使用HTTP调用器暴露服务
17.4.1. Exposing the service object
17.4.2. 在客户端连接服务
17.5. Web Services
17.5.1. 使用JAX-RPC暴露基于servlet的web服务
17.5.2. 使用JAX-RPC访问web服务
17.5.3. 注册JAX-RPC Bean映射
17.5.4. 注册自己的JAX-RPC 处理器
17.5.5. 使用JAX-WS暴露基于servlet的web服务
17.5.6. 使用JAX-WS暴露单独web服务
17.5.7. 使用Spring支持的JAX-WS RI来暴露服务
17.5.8. 使用JAX-WS访问web服务
17.5.9. 使用XFire来暴露Web服务
17.6. JMS
17.6.1. 服务端配置
17.6.2. 客户端配置
17.7. 对远程接口不提供自动探测实现
17.8. 在选择这些技术时的一些考虑

17.1. 简介

Spring为各种远程访问技术的集成提供了整合类。Spring使得开发具有远程访问功能的服务变得相当容易,而这些远程访问服务由普通Spring POJO实现。目前,Spring支持四种远程技术:

  • 远程方法调用(RMI)。通过使用 RmiProxyFactoryBeanRmiServiceExporter,Spring同时支持传统的RMI(使用java.rmi.Remote接口和java.rmi.RemoteException)和通过RMI调用器实现的透明远程调用(支持任何Java接口)。

  • Spring的HTTP调用器。Spring提供了一种允许通过HTTP进行Java串行化的特殊远程调用策略,它支持任意Java接口(就像RMI调用器)。相对应的支持类是 HttpInvokerProxyFactoryBeanHttpInvokerServiceExporter

  • Hessian。通过 HessianProxyFactoryBeanHessianServiceExporter,可以使用Caucho提供的基于HTTP的轻量级二进制协议来透明地暴露服务。

  • Burlap。 Burlap是Caucho基于XML用来替代Hessian的项目。Spring提供了诸如 BurlapProxyFactoryBeanBurlapServiceExporter 的支持类。

  • JAX RPC。Spring通过JAX-RPC(J2EE 1.4's wweb service API)为Web services提供远程服务支持。

  • JAX-WS. Spring通过(在Java EE 5和Java 6中引入的JAX-RPC继承)为远程Web Services提供支持。

  • JMS. 通过JmsInvokerServiceExporterJmsInvokerProxyFactoryBean使用JMS做为底层协议提供远程服务.

在讨论Spring对远程访问的支持时,我们将使用下面的域模型和对应的服务:

public class Account implements Serializable{

    private String name;

    public String getName();

    public void setName(String name) {
      this.name = name;
    }
}
public interface AccountService {

    public void insertAccount(Account account);

    public List getAccounts(String name);
}
public interface RemoteAccountService extends Remote {

    public void insertAccount(Account account) throws RemoteException;

    public List getAccounts(String name) throws RemoteException;
}
// 该实现目前什么事情也不做
public class AccountServiceImpl implements AccountService {

    public void insertAccount(Account acc) {
        //  做一些事情……
    }
  
    public List getAccounts(String name) {
        // 做一些事情……
    }
}

我们将从使用RMI把服务暴露给远程客户端开始,同时探讨RMI的一些缺点。然后我们将演示一个使用Hessian的例子。