一、介绍
目前,Spring提供对下面四种远程访问技术的支持:
- 远程方法调用(RMI):通过使用RmiProxyFactoryBean和RmiServiceExporter,Spring支持传统的RMI(使用java.rmi.Remote interfaces 和 java.rmi.RemoteException)和通过RMI调用器(可以使用任何Java接口)的透明远程调用。
- Spring的HTTP调用器:Spring提供一种特殊的远程调用策略支持任何Java接口(象RMI调用器一样),它允许Java序列化能够通过HTTP传送。对应的支持类是HttpInvokerProxyFactoryBean和HttpInvokerServiceExporter。
和Burlap和Hessian使用自身序列化机制的轻量级协议相反,Spring HTTP调用器使用标准Java序列化机制来通过HTTP输出业务。如果你的参数或返回值是复杂类型,并且不能通过Hessian和Burlap的序列化机制序列化,HTTP调用器就很有优势。Spring可以使用J2SE提供的标准功能或Commons的HttpClient来实现HTTP调用。如果你需要更先进,更好用的功能,就使用后者。
- Hessian:通过使用HessianProxyFactoryBean和HessianServiceExporter,你可以使用Caucho提供的轻量级基于HTTP的二进制协议透明地提供你的业务。Hessian提供了一个基于HTTP的二进制远程协议。它由Caucho创建。
- Burlap:Burlap是基于XML的,它可以完全代替Hessian。Spring提供的支持类有BurlapProxyFactoryBean和BurlapServiceExporter。 Burlap是Hessian的基于XML实现。
二、如何选择?
当使用RMI时,通过HTTP协议访问对象是不可能的,除非你用HTTP包裹RMI流。RMI是一种很重的协议,因为他支持完全的对象序列化,这样的序列化在要求复杂数据结构在远程传输时是非常重要的。然而,RMI-JRMP只能绑定到Java客户端:它是一种Java-to-Java的远程访问的方案。
如果你需要基于HTTP的远程访问而且还要求使用Java序列化,Spring的HTTP调用器是一个很好的选择。它和RMI调用器使用相同的基础设施,仅仅使用HTTP作为传输方式。注意HTTP调用器不仅只能用在Java-to-Java的远程访问,而且在客户端和服务器端都必须使用Spring。(Spring为非RMI接口提供的RMI调用器也要求客户端和服务器端都使用Spring)
当在异构环境中,Hessian和Burlap就非常有用了。因为它们可以使用在非Java的客户端。然而,对非Java支持仍然是有限制的。已知的问题包括含有延迟初始化的collection对象的Hibernate对象的序列化。如果你有一个这样的数据结构,考虑使用RMI或HTTP调用器,而不是Hessian。
最后但也很重要的一点,EJB优于RMI,因为它支持标准的基于角色的认证和授权,以及远程事务传递。用RMI调用器或HTTP调用器来支持安全上下文的传递是可能的,虽然这不是由核心Spring提供:而是由第三方或在定制的解决方案中插入拦截器来解决的。
三、例子
定义好用于测试的接口和实现。
package com.logcd.server.service;
public interface IHelloService {
public String doHello(String name);
}
package com.logcd.server.service.impl;
import com.logcd.server.service.IHelloService;
public class HelloService implements IHelloService{
public String doHello(String name) {
return "Hello , " + name;
}
}
(一)使用Hessian
(1)server端:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>Hessian</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:Hessian-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Hessian</servlet-name>
<url-pattern>/hessian/*</url-pattern>
</servlet-mapping>
</web-app>
(2)server端:Hessian-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloService" class="com.logcd.server.service.impl.HelloService"/>
<bean name="/helloService" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="helloService"/>
<property name="serviceInterface">
<value>
com.logcd.server.service.IHelloService
</value>
</property>
</bean>
</beans>
(3)client端测试:Hessian-client.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl">
<value>http://localhost:8080/hessian/helloService</value>
</property>
<property name="serviceInterface">
<value>com.logcd.server.service.IHelloService</value>
</property>
</bean>
</beans>
(4)测试程序:
package com.logcd.client.test;
import java.net.MalformedURLException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.caucho.hessian.client.HessianProxyFactory;
import com.logcd.server.service.IHelloService;
public class HessianTest {
public static void main(String args[]){
clientSpringTest();
}
public static void clientSpringTest(){
ApplicationContext context= new ClassPathXmlApplicationContext("Hessian-client.xml");
IHelloService helloService = (IHelloService)context.getBean("helloService");
System.out.println(helloService.doHello("logcd"));
}
public static void clientJavaTest(){
String url = "http://localhost:8080/hessian/helloService";
HessianProxyFactory factory = new HessianProxyFactory();
try {
IHelloService helloService =(IHelloService)factory.create(IHelloService.class, url);
System.out.println(helloService.doHello("logcd"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
(二)使用HTTP调用器
(1)server端:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>httpInvoker</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:httpinvoker-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>httpInvoker</servlet-name>
<url-pattern>/httpInvoker/*</url-pattern>
</servlet-mapping>
</web-app>
(2)server端:httpinvoker-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloService" class="com.logcd.server.service.impl.HelloService"/>
<bean name="/helloService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter" lazy-init="false">
<property name="service">
<ref bean="helloService"/>
</property>
<property name="serviceInterface">
<value>com.logcd.server.service.IHelloService</value>
</property>
</bean>
</beans>
(3)client端:httpinvoker-client.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl">
<value>http://localhost:8080/httpInvoker/helloService</value>
</property>
<property name="serviceInterface">
<value>com.logcd.server.service.IHelloService</value>
</property>
<!--
默认情况下,客户端的HttpInvokerProxy使用J2SE的HTTP Client来建立连接
org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor
-->
<property name="httpInvokerRequestExecutor">
<bean
class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor" />
</property>
</bean>
(4)测试类
package com.logcd.client.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean;
import com.logcd.server.service.IHelloService;
public class HttpInvokerTest {
public static void main(String args[]){
clientJavaTest();
}
public static void clientSpringTest(){
ApplicationContext context= new ClassPathXmlApplicationContext("httpinvoker-client.xml");
IHelloService helloService = (IHelloService)context.getBean("helloService");
System.out.println(helloService.doHello("logcd"));
}
public static void clientJavaTest(){
String url = "http://localhost:8080/httpInvoker/helloService";
HttpInvokerProxyFactoryBean factory = new HttpInvokerProxyFactoryBean ();
factory.setServiceInterface(IHelloService.class);
factory.setServiceUrl(url);
factory.afterPropertiesSet();
IHelloService helloService = (IHelloService)factory.getObject();
System.out.println(helloService.doHello("logcd"));
}
}
四、使用自定义Annotation实现
(1)
Custom Annotation Configuration for Spring Remoting
(2)
Custom Annotation Configuration for Spring Remoting, Part Two
分享到:
相关推荐
基于Spring的远程访问与Web Service
Spring远程访问通过使用普通POJOs,能更容易的开发远程访问服务。目前,Spring远程访问的主要技术如下: 1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,...
标题中的"Spring 远程调用"指的是Spring的远程服务访问(Remote Service Access,RSA)。RSA允许服务提供者创建远程服务,而服务消费者可以跨网络调用这些服务。在Web服务上下文中,Spring提供了WebServiceTemplate...
Spring Web Services 是基于 Spring 框架的 Web 服务框架,主要侧重于基于文档驱动的Web服务,提供 SOAP 服务开发,允许通过多种方式创建 Web 服务。本章利用Apache CXF构建和开发webservice. 1. webservice远程...
前几章我们分别利用spring rmi、httpinvoker、httpclient、webservice技术实现不同服务器间的远程访问。本章我将通过spring jms和activemq实现单Web项目服务器间异步访问和多Web项目服务器间异步访问。 一. 简介 1. ...
在Spring Web Flow项目中应用Hessian服务,是一个深入整合分布式服务和前端流程管理的重要实践。Spring Web Flow(SWF)是一个强大的MVC框架,用于构建具有复杂导航逻辑的Web应用程序,而Hessian则是一种轻量级的二...
1. **Spring支持的远程访问技术**:Spring框架支持多种远程访问技术,包括RMI(Remote Method Invocation)、JAX-RPC(Java API for XML-based Remote Procedure Call)、Hessian、Burlap、XFire以及Spring自带的...
8. **异常处理**:Spring和CXF结合时,可以使用Spring的AOP来处理Web服务调用中的异常。例如,可以定义一个切面来捕获并处理CXF抛出的异常。 9. **测试和调试**:在集成测试中,可以使用Spring的TestContext框架和...
整合这两者,我们可以方便地在Spring配置文件中定义服务接口和其实现,然后使用Hessian生成代理,使得客户端可以透明地调用远程服务。 具体步骤如下: 1. **创建服务接口**:首先,我们需要定义一个服务接口,这个...
1. 入门指南 2. 介绍Spring框架 3. IoC容器 4. 资源 5. 验证、数据绑定和类型转换 6. Spring表达式语言 ...24. 使用Spring提供远程和WEB服务 25. 整合EJB 26. JMS 28. 使用Spring提供远程和WEB服务 32. 缓存
在本实验中,我们将探讨如何使用 Spring 和 SpringMVC 框架构建一个简单的 Web 应用系统。Spring 是一个全面的 Java 应用开发框架,而 SpringMVC 是其用于构建 MVC(Model-View-Controller)架构的 Web 应用部分。这...
首先,我们需要理解什么是Spring远程调用。Spring Remote提供了一种机制,使得应用程序能够跨越网络边界调用其他服务的方法,仿佛它们是在同一进程中执行一样。HTTP远程调用是Spring Remote的一种实现方式,通过HTTP...
学习这个例子,开发者可以了解如何在Spring环境中构建、部署和测试Web服务,理解服务提供者和服务消费者的实现细节。此外,由于没有依赖外部库,这也有助于理解基本的组件和机制,对于初学者来说是很好的实践练习。...
综上所述,使用Spring构建RESTful Web服务涉及到多个方面,包括架构设计、数据模型定义、依赖管理、请求处理、数据表示和性能优化等。掌握这些概念和技术,能够帮助开发者高效地开发出高质量的RESTful服务。
文档内容涉及了Spring的IoC容器、资源管理、验证与数据绑定、Bean操作、表达式语言、测试、数据访问、ORM、远程服务、Web服务、JMS、CORS、WebSocket等众多方面。 在IoC容器部分,文档详细解释了依赖注入和控制反转...
本源码提供了一个基于Spring MVC、CXF和Hibernate的Web服务与数据库操作设计。...这个系统通过Web服务技术(webservice)实现了对数据库数据的增删查操作,适合需要进行远程数据访问和操作的应用场景。
一旦启动,你可以在默认的8161端口上访问Web管理界面。 2. **添加依赖**:在你的Web工程中,需要引入Spring和ActiveMQ的相关依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>...
在本项目中,"包括访问spring配置对象的两种方式"可能指的是通过AMF和HTTPService两种不同的通信机制来访问Spring服务。序列化机制的对应实现可能是使用Flex的FlashRemoting或XML/JSON解析库,将Flex的数据模型转换...
12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. ...