对于一个Java接口来说,如果使用者和其实现类不在同一环境,比如实现类在网络的其他机器,那么如何来访问接口实现类的逻辑呢?答案是远程方法调用。简称RMI。
Spring 简化了RMI的实现过程,我们现在只要配置好即可正确发布我们的RMI服务。
package com.spring.rmi.common;
public interface IPerson {
public String getName();
public String getEmail();
}
package com.spring.rmi.common.impl;
import com.spring.rmi.common.IPerson;
public class PersonImpl implements IPerson {
@Override
public String getName() {
return "mike";
}
@Override
public String getEmail() {
return "zhaoming23@gmail.com";
}
}
服务端配置文件:server-rmi.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 1.用RMI发布的接口实现类 -->
<bean id="personImpl" class="com.spring.rmi.common.impl.PersonImpl" />
<!-- 2.利用Spring类发布这个RMI服务 -->
<bean id="service" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service">
<!-- 2.1指定服务的实现 -->
<ref bean="personImpl" />
</property>
<property name="serviceName">
<!-- 2.2指定服务的名字 -->
<value>person</value>
</property>
<property name="serviceInterface">
<!-- 2.3指定服务的接口 -->
<value>com.spring.rmi.common.IPerson</value>
</property>
<property name="registryPort">
<!-- 2.4指定服务的端口 -->
<value>5923</value>
</property>
</bean>
</beans>
package com.spring.rmi;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class RmiBootstrap {
public static void main(String[] args) throws InterruptedException {
new ClassPathXmlApplicationContext("server-rmi.xml");
Thread.sleep(1000 * 60 * 60 );
}
}
这样就启动了我们的RMI服务,那么客户端如果使用呢?
客户端配置文件:client-rmi.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="person" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface">
<value>com.spring.rmi.common.IPerson</value>
</property>
<property name="serviceUrl">
<value>rmi://localhost:5923/person</value>
</property>
</bean>
</beans>
package client;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.rmi.common.IPerson;
public class RmiInvoke {
private static final Logger logger = Logger.getLogger(RmiInvoke.class);
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("client-rmi.xml");
IPerson p = (IPerson) context.getBean("person");
logger.info(p.getName());
logger.info(p.getEmail());
}
}
运行结果
etc...
16:55:12 [main] INFO (RmiInvoke.java:15) - mike
16:55:12 [main] INFO (RmiInvoke.java:16) - zhaoming23@gmail.com
以上代码运行还需要必要的jar包
Spring相关jar包
aopalliance.jar
apache commons-logging.jar
在实际使用中还有一种情况是开多个服务
其实只要在服务端多配置一个类似的RmiServiceExporter
当然发布的时候注意名称不要相同即可。
分享到:
相关推荐
自己收集了一些跑得通的教程,并自己整理给出了,入门例子。包括:最原生的使用javac和rmic的例子;还有进一步的,使用IDM,用代码代理原生rmic...还有RMI和Spring整合的例子。 另外附有:例子说明 和 一些简单的教程。
java Spring+RMI入门程序源代码
spring 对 RMI 的封装 一个很精简的例子,用于springRMI的入门学习很好 调试通过咯
RMI Hessian、 Burlap Http Invoker <br>邮件 对于邮件发送服务的支援是由Spring的 org.springframework.mail.MailSender介面所定义,它有两个实作类别, org.springframework.mail.cos....
Pro Spring Integration, 英文版....Spring Integration可以和EJB、RMI、JMS这些标准技术协同使用,能让你在一处对复杂的解决方法进行建模,从而对标准技术有所增强。这在很大程度上简化了这些技术的使用。
word源码java fleet-spring-boot ...RMI 远程调用框架 :Spring Boot Hessian 远程调用框架 :Spring Boot Forest Http 请求 :Spring Boot HTTP 访问控制 :Spring Boot GraphQL 构建 API :Spring Boot
第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...
10.1 Flex入门 388 10.1.1 问题 388 10.1.2 解决方案 388 10.1.3 工作原理 388 10.2 离开沙箱 393 10.2.1 问题 393 10.2.2 解决方案 394 10.2.3 工作原理 394 10.3 为应用添加Spring BlazeDS支持 ...
10.1 Flex入门 388 10.1.1 问题 388 10.1.2 解决方案 388 10.1.3 工作原理 388 10.2 离开沙箱 393 10.2.1 问题 393 10.2.2 解决方案 394 10.2.3 工作原理 394 10.3 为应用添加Spring BlazeDS支持 ...
第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...
第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...
Java EE包括2个体系:标准(上面介绍的)+流行(Struts+Hibernate+Spring) 两套体系都是JSP+Servlet为基础。 2 JSP会涉及哪些内容 JSP语法基础(Java+HTML): 对于Java,需要掌握Java的基本语法(类...
Java开发入门:JDK、JVM、Eclipse、Linux。Java语法基础:类、抽象类、接口、内部类、匿名类、异常、编码规范。Java核心编程:流、多线程、实体类、集合类、正则表达式、XML、属性文件。Java图形编程:AWT(Java2D、...
第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...
适用于Jersey,Jersey2,GWT,JavaScript,JQuery,Netty,Guice,Spring,RMI,RabbitMQ,Redis,Hazelcast,JGroups,jsr 356,Sockjs,Socket.IO,JMS,Vert.x,Play框架,Java的Atmosphere WebSockets示例EE,...
嵌入式jmxtrans ...启用了Spring Framework的Web应用程序的入门指南。 玛文 添加embedded-jmxtrans依赖项 < groupId>org.jmxtrans.embedded < artifactId>embedded-jmxtrans < version>1.0.12</ version
国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...