今天在重看Spring in Action,看到远程调用这一章。讲到了Spring简化RMI的开发。说实话,在我的工作中还从来没有编写过RMI的代码,关于RMI也只是当初学习的时候看过一点点,现在早就忘记了。因此又把RMI翻出来看了看。
编写RMI客户-服务器程序包括以下的基本步骤:
1. 定义远程接口
2. 实现远程接口
3. 生成stub 和 skeleton (V1.2不需要skeleton)
4. 启动注册表并注册对象
5. 编写使用远程对象的客户
其中1-4是服务器端要进行的工作,5是客户端要进行的工作。下面是一个很简单的RMI的示例程序:
1. 定义远程接口
import java.rmi.Remote;
public interface HelloInterface extends Remote {
public String sayHello() throws java.rmi.RemoteException;
}
2. 实现远程接口
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Calendar;
public class HelloServer extends UnicastRemoteObject implements HelloInterface {
public HelloServer() throws RemoteException {
super();
}
@Override
public String sayHello() throws RemoteException {
String greeting = null;
int hourOfDay = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if (hourOfDay >= 20){
greeting = "Good evening.";
} else if (hourOfDay >= 12){
greeting = "Good afternoon.";
} else {
greeting = "Good Morning";
}
return greeting;
}
}
3. 生成stub和skeleton
使用Java提供的命令行来生成
rmic -d HelloServer
4. 启动注册表并注册对象
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class HelloServerRegistor {
public static void main(String[] args){
try{
HelloServer server = new HelloServer();
System.out.println("HelloServer is created: ");
LocateRegistry.createRegistry(1099);
Naming.rebind("/HelloServer", server);
System.out.println("HelloServer is bound.");
} catch (Exception e){
e.printStackTrace();
}
}
}
5. 编写客户端程序
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import ServerSide.HelloInterface;
public class HelloClient {
public static void main(String[] args){
if (System.getSecurityManager() == null){
System.setSecurityManager(new RMISecurityManager());
}
try{
HelloInterface server = (HelloInterface)Naming.lookup("/HelloServer");
System.out.println(server.sayHello());
} catch (Exception e){
e.printStackTrace();
}
}
}
上面是我们直接使用RMI时需要手动完成的工作,注意因为我的实例代码都是运行在同一台机器上的,在RMI的URL中没有指定主机名称。
下面来看我们使用Spring会简化哪些工作。
从客户端的角度来看:
假设已经有服务器提供了HelloServer服务,我们只需要调用该服务。Spring使用RmiProxyFactoryBean来创建指向RMI服务的代理。
引用
<bean id = "HelloServer" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl">
<value> /HelloServer</value>
</property>
<property name="serviceInterface">
<value>HelloInterface</value>
</property>
</bean>
要调用HelloServer的程序就可以使用Spring定义的这个HelloServer bean来调用RMI了。
抛开Spring所提倡的IoC等,对于客户端来说,其实没有简化多少东西。另外Spring框架在这里会处理所有的RemoteException并将其封装成RuntimeException抛出,因此在客户端程序中不是必须要写RemoteException的处理代码。
从服务器端的角度来看
1.我们仍然需要定义接口,但是不需要继承Remote接口。
2.当然也需要实现该接口。
3.将实现类在Spring中配置为bean
引用
<bean id="HelloServerImpl" class="HelloServer">
......
</bean>
4.使用Spring的RmiServiceExporter将bean输出成一个RMI服务
引用
<bean class="org.spring.framework.remoting.rmi.RmiServiceExporter">
<property name="service">
<ref bean="HelloServerImpl"/>
</property>
<property name="serviceName">
<value>HelloServer</value>
</property>
<property name="serviceInterface">
<value>HelloInterface</value>
</property>
</bean>
对于服务器端来说,原来的步骤3(生成stup和skeleton)与步骤4(启动注册表并注册RMI服务)没有了,取而代之的是配置了RmiServiceExporter类型的bean。但是从实际的工作量上来看,并没有简化多少。
那么使用Spring进行RMI编程到底简化了什么呢?我的理解是,由于Spring封装了RMI的具体实现,所以简化的实际上是对RMI编程知识的要求。
分享到:
相关推荐
Spring的面向切面编程(AOP)可以与RMI集成,提供日志记录、性能监控、安全控制等功能。通过定义切点和通知,可以在RMI调用前后执行特定逻辑。 ### 5. Spring RMI优化 - **RMI超时设置**:可以配置RMI连接和操作的...
Spring框架则是一个强大的轻量级应用框架,它提供了依赖注入、面向切面编程等功能,极大地简化了企业级Java应用的开发。 当我们谈论“RMI与Spring整合实例”时,我们通常是指将RMI技术与Spring框架结合使用,以便...
Spring通过提供RMI集成,简化了RMI服务的创建和调用。以下是一些关键点: 1. **服务接口定义**:首先,你需要定义一个远程服务接口,这个接口将包含你希望在远程进程中执行的方法。 2. **服务实现**:接着,创建该...
在IT行业中,Spring框架是Java开发中的一个基石,它提供了丰富的功能来简化应用程序的构建,包括远程过程调用(Remote Method Invocation,RMI)服务。本文将深入探讨"spring rmi 改造"这一主题,主要关注如何在原有...
Spring RMI在此基础上提供了更高级别的抽象,通过Spring的依赖注入(DI)和AOP(面向切面编程)能力简化了服务的创建和调用。 要实现Spring RMI,我们需要以下组件: 1. **远程接口(Remote Interface)**:这是...
Spring框架是Java开发中广泛应用的轻量级框架,它提供了丰富的功能来简化应用程序的构建,包括依赖注入、AOP(面向切面编程)以及多种集成技术。RMI(Remote Method Invocation,远程方法调用)是Java平台上的一个...
在Spring框架中,我们可以通过Spring的AOP(面向切面编程)和IoC(控制反转)特性简化RMI服务的创建和管理。首先,你需要定义一个Service接口和其实现类,这些类可以像普通Spring Bean一样被管理。例如: ```java ...
Spring框架提供了对RMI的支持,简化了RMI的配置和使用,使得开发人员可以更加便捷地构建分布式服务。 首先,我们来看“SpringRMIClient”和“SpringRMIServer”这两个文件名,它们分别代表了RMI应用中的客户端和...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而RMI(Remote Method Invocation)则是Java提供的一种远程方法调用机制,用于构建分布式应用程序。将Spring与RMI结合,可以实现非本地部署的服务,...
Spring RMI在此基础上增加了配置简化、依赖注入等特性,使得远程服务的创建和调用更加便捷。 首先,我们来理解一下Spring RMI的核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,通常...
总结起来,这个登录Demo巧妙地融合了Spring的控制反转与面向切面编程,Hibernate的对象关系映射,MySQL的可靠数据存储,RMI的远程通信,以及Swing的图形界面设计,形成了一套完整的客户端-服务器端应用。这样的组合...
在IT领域,Spring框架是...这种配置方式提高了代码的可维护性和模块化程度,同时也利用了Spring的强大功能,简化了RMI的使用。在实际项目中,可以根据需求进一步优化配置,比如添加异常处理、负载均衡、安全控制等。
2. Spring Bean管理:Spring容器可以管理和实例化远程服务对象,通过配置文件或注解定义Bean,简化RMI服务的创建和管理。 3. JNDI查找:Spring可以使用JNDI(Java Naming and Directory Interface)来查找RMI注册表...
标题中的关键词包括“Spring”、“RMI”、“thread”、“Hibernate”和“Webservice”,这些是Java编程中的核心概念,尤其在企业级应用开发中尤为重要。接下来,我们将详细探讨这些技术。 1. **Spring**:Spring 是...
Spring框架提供了一套更高级别的抽象来简化RMI的使用。通过Spring的`RemoteProxyFactoryBean`,可以创建一个代理对象,该对象在调用方法时自动执行RMI调用。此外,Spring的`RmiServiceExporter`可以方便地导出一个...
- 客户端使用`org.springframework.remoting.rmi.RmiProxyFactoryBean`实现远程服务的代理功能。 - 客户端还需要定义与服务器端服务接口相同的类,以便进行调用。 #### 3. RMI的局限性 RMI当前使用Java远程消息...
Java RMI(远程方法调用)是Java编程语言中的一项核心技术,自JDK 1.1版本起就被引入,用于构建分布式系统。RMI允许Java对象在不同的Java虚拟机(JVMs)之间进行交互,仿佛这些对象是在同一台机器上一样。这种技术的...
远程方法调用(Remote Method Invocation, RMI)是Java平台上的一个核心特性,它允许Java对象在不同的JVM之间进行...通过上述文件学习,你可以深入理解RMI的概念,掌握RMI的使用方法,以及Spring如何简化RMI的集成。
- **Spring框架简介**:Spring框架是一个开源的轻量级企业应用开发框架,它提供了全面的编程和配置模型,简化了Java EE应用程序的开发。 - **Spring 4版本特点**:本书《Pro Spring 4》覆盖的是Spring 4版本,这一...