- 浏览: 468409 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yuan_bin1990:
您好,请问下demo如何运行啊,准备研究研究,但不知道入口啊。 ...
ssh2(struts2+spring2.5+hibernate3.3)自动生成代码程序 -
luyulong:
[b][/b][i][/i][ ...
jQuery进度条插件 jQuery progressBar -
txin0814:
mark..
读取文件目录 -
vurses:
[align=center][color=red][size= ...
include 与 jsp:include区别 -
Roshan2:
http://lijiejava.iteye.com/blog ...
Spring AOP 入门实例
一、介绍
目前,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; 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;
- }
- }
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>
<?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>
<?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>
<?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();
- }
- }
- }
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>
<?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>
<?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>
<?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"));
- }
- }
发表评论
-
Spring AOP 入门实例
2011-09-26 13:42 1440以Struts2+Spring为例,要求必须在登录之后才能实现 ... -
Spring MVC blog
2011-09-14 11:15 0REST in Spring 3: @MVC Pos ... -
Spring REST 是什么
2011-09-06 16:41 1006概述 REST是英文Repr ... -
Spring Rest
2011-09-06 16:31 3329由于下一版本的rapid-framwork需要集成spring ... -
spring 事务管理
2010-06-16 21:40 1016声明式的事务管理(Declarative transactio ... -
Spring2.X以AspectJ 式AOP 配置事务
2010-06-16 21:40 1075(1)配置: Spring的事务管理是通过AOP代理实 ... -
spring使用RMI暴露服务
2010-06-16 21:38 1650(1)定义接口: Java代码 pack ... -
spring jdbcTemplate使用
2010-06-16 21:36 1966(1)springJdbcContext.xml J ... -
在SPRING中实现事务暂停
2010-06-11 14:00 972摘要 Spring框架是一个流行的基于轻量级控制反转容器的J ... -
Spring的事务属性意义------transactionAttributes
2010-05-25 08:56 928PROPAGATION_REQUIRED--支持当前事务,如果 ... -
spring java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. <init>(Z)V
2010-05-20 17:57 1598因为cglib 包和asm包冲突 开始用的cglib包是cgl ... -
Spring整合webService xfire
2010-05-07 10:14 1667注意,需要下载Xfire1.2.6、spring2.0,hib ... -
实现JSON和POJO的相互转换
2010-04-25 22:14 1434import java.util.Collection; ... -
spring注解注入
2010-04-13 22:20 1768以前在使用spring是通过xml来注入的,每次增加一个ser ... -
关于spring 乱码经验
2009-12-29 13:47 1321spring 集成框架的乱码问题,真是搞了很久,下面我就提几点 ...
相关推荐
基于Spring的远程访问与Web Service
Spring远程访问通过使用普通POJOs,能更容易的开发远程访问服务。目前,Spring远程访问的主要技术如下: 1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,...
本示例聚焦于一个具体的场景:使用C#客户端远程调用基于Spring框架的Java Web服务。以下将详细阐述涉及的技术点。 首先,Spring框架是Java领域的一个核心组件,尤其在企业级应用开发中广泛使用。它提供了一个全面的...
Spring Web Services 是基于 Spring 框架的 Web 服务框架,主要侧重于基于文档驱动的Web服务,提供 SOAP 服务开发,允许通过多种方式创建 Web 服务。本章利用Apache CXF构建和开发webservice. 1. webservice远程...
首先,我们需要理解什么是Spring远程调用。Spring Remote提供了一种机制,使得应用程序能够跨越网络边界调用其他服务的方法,仿佛它们是在同一进程中执行一样。HTTP远程调用是Spring Remote的一种实现方式,通过HTTP...
1. **Spring支持的远程访问技术**:Spring框架支持多种远程访问技术,包括RMI(Remote Method Invocation)、JAX-RPC(Java API for XML-based Remote Procedure Call)、Hessian、Burlap、XFire以及Spring自带的...
3. **创建Hessian客户端**:在Spring Web Flow的客户端,我们需要创建一个`HessianProxyFactoryBean`,设置远程服务的URL和接口类型,这样就能生成一个可以调用远程方法的代理对象。 4. **在SWF中使用Hessian服务**...
这样,Spring会自动创建一个客户端代理,可以通过这个代理调用远程Web服务。 6. **CxfSpringClient**:根据提供的文件名,这可能是一个示例项目或者代码,展示了如何在Spring环境中配置和使用CXF客户端。可能包含...
它还包含了对事务管理、数据访问/集成、远程访问、声明式缓存等的支持,以及用于简化企业级应用开发的各种工具。 2. **SpringMVC**: SpringMVC 是 Spring 框架的一部分,用于构建 Web 应用的模型视图控制器。它...
4. **发布服务**:将服务部署到Web服务器,如Tomcat,这样客户端就可以通过HTTP访问Hessian服务。 5. **创建Hessian客户端**:在客户端,我们需要创建一个HessianProxyFactoryBean,指定远程服务的URL和接口类型。 ...
前几章我们分别利用spring rmi、httpinvoker、httpclient、webservice技术实现不同服务器间的远程访问。本章我将通过spring jms和activemq实现单Web项目服务器间异步访问和多Web项目服务器间异步访问。 一. 简介 1. ...
### 使用Spring构建RESTful的Web服务 #### REST原则与特性 **REST(Representational State Transfer)**是一种软件架构风格,用于定义客户端与服务器之间交互的标准方法。RESTful Web服务遵循以下核心原则: - *...
在IT行业中,Spring框架和Web服务(Web Service)是两个重要的技术领域,它们在构建分布式系统和企业级应用中发挥着关键作用。本示例"Spring+webservice例子"聚焦于如何结合Spring框架来实现Web服务,特别是侧重于...
一旦启动,你可以在默认的8161端口上访问Web管理界面。 2. **添加依赖**:在你的Web工程中,需要引入Spring和ActiveMQ的相关依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>...
- 这样可以方便地从客户端调用远程发布的Web服务。 ```plaintext wsdl2java -uri http://localhost:8080/projectName/services/PlatformServer?wsdl -o D:\temp ``` #### 五、总结 通过上述步骤,我们可以成功地将...
1. 入门指南 2. 介绍Spring框架 3. IoC容器 4. 资源 5. 验证、数据绑定和类型转换 6. Spring表达式语言 ...24. 使用Spring提供远程和WEB服务 25. 整合EJB 26. JMS 28. 使用Spring提供远程和WEB服务 32. 缓存
Spring还提供了Web服务支持,使得其他应用程序(如Flex)可以通过HTTP或更高级的协议(如SOAP或RESTful服务)来调用Spring Bean。 集成Spring和Flex的关键步骤包括: 1. 在Spring配置中定义服务Bean,这些Bean将...
Spring是一个开源的Java平台,它简化了Java开发,提供了丰富的功能,如依赖注入(DI)、面向切面编程(AOP)、数据访问/集成、事务管理、远程调用等。Spring的核心是容器,它负责管理对象的生命周期和对象之间的...
Spring 框架还提供了许多其他模块,如 Spring Data(数据访问)、Spring Security(安全)、Spring Boot(快速开发)、Spring Cloud(微服务架构)等,可以根据项目需求进行选择和集成。 总的来说,这个 "spring ...