环境介绍:本文中服务端客户端使用的都是ssm框架,配置文件分为spring_servlet.xml,spring_service.xml,mybatis.xml

在spring里面使用rmi完成远程调用步骤分以下几步:

一、在服务端

1.编写服务端接口

 package com.dzf.service;

 import java.util.List;

 import com.dzf.entity.Author;

 public interface RmiServerService {
public List<Author> getAuthorByName(String name); public Integer insertAuthor(Author author);
}

2.编写具体的实现类

 package com.dzf.service;

 import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.dzf.dao.AuthorDao;
import com.dzf.entity.Author;
//@Service //这里面不需要自动注入,需要手写bean
public class RmiServerServiceImpl implements RmiServerService { @Autowired
private AuthorDao authorDao; @Override
public List<Author> getAuthorByName(String name) {
// TODO Auto-generated method stub
if(name==null && "".equals(name)){
return null;
}
return authorDao.getAuthorByName(name);
} @Transactional
@Override
public Integer insertAuthor(Author author) {
// TODO Auto-generated method stub
if(author == null){
return null;
}
authorDao.insert(author);
return author.getId(); //返回的插入这条数据的主键值
} }

3.在spring-service.xml中添加服务端的配置

 <bean name = "rmiServerService" class="com.dzf.service.RmiServerServiceImpl"></bean>
<bean name="rmiTest" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="rmiServerService" />
<property name="serviceName" value="rmiServerService" />
<!--这个地方必须写接口的位置全限定名 -->
<property name="serviceInterface" value="com.dzf.service.RmiServerService"/>
<!-- 这个端口不能和项目的端口一样,是个独立的端口 -->
<property name="registryPort" value="8083" />
</bean>

我这里把dao层的写法也贴出来,仅供查考

package com.dzf.dao;

import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository; import com.dzf.entity.Author; @Repository
public interface AuthorDao { @Select("select * from author t where t.id = #{id}")
public Author getAuthorById(Integer Id); @Select("select * from author t where t.name like concat('%',#{name},'%')")
public List<Author> getAuthorByName(String name); @Insert("insert into author(name,age,tel) values (#{name},#{age},#{tel})")
@Options(useGeneratedKeys=true,keyProperty="id")
public Integer insert(Author author);
}

二、客户端(调用端的配置)

1.编写一个和服务端一模一样的接口

 1 package com.dzf.service;
2
3 import java.util.List;
4
5 import com.dzf.entity.Author;
6
7 public interface RmiServerService {
8 public List<Author> getAuthorByName(String name);
9
10 public Integer insertAuthor(Author author);
11 }

2.编写配置文件

 <!-- Spring Rmi 客户端配置 -->
<bean id="rmiServerService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://127.0.0.1:8083/rmiServerService"/>
<property name="serviceInterface" value="com.dzf.rmi.service.RmiServerService"/>
<property name="lookupStubOnStartup" value="false"/>
<property name="refreshStubOnConnectFailure" value="true"></property>
</bean>

3.编写controller层的代码

 package com.dzf.rmi.controller;

 import java.util.List;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.dzf.entity.Author;
import com.dzf.rmi.service.RmiServerService; @Controller
@RequestMapping("/rmi")
public class RmiServlet { @Autowired
private RmiServerService rmiServerService; //这个起的名字要和配置文件里面的一样 @RequestMapping("/getAuthorByName")
@ResponseBody
public List<Author> getAuthorByName(){
String name = "a";
return rmiServerService.getAuthorByName(name);
} @RequestMapping("/insert")
@ResponseBody
public Integer insert(){
Author author = new Author();
author.setName("丁");
author.setAge(23);
author.setTel("13033563156");
return rmiServerService.insertAuthor(author);
} }

4.使用接口工具调用

1.

2.

到此可以看到,调用完全没有问题!

总结下:

核心

1.服务端通过org.springframework.remoting.rmi.RmiServiceExporter这个类暴露服务接口

2.服务端和客户端定义同样的接口

3.调用端通过org.springframework.remoting.rmi.RmiProxyFactoryBean调用服务端的暴露的接口

注意:实体类需要实现序列化接口!

Spring之rmi实例演示的更多相关文章

  1. Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例

    RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网 ...

  2. 转载:Spring+EhCache缓存实例

    转载来自:http://www.cnblogs.com/mxmbk/articles/5162813.html 一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干 ...

  3. Spring+EhCache缓存实例

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  4. 审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1

    下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进 ...

  5. Spring+EhCache缓存实例(详细讲解+源码下载)(转)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  6. Spring+EhCache缓存实例(详细讲解+源码下载)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  7. Spring之RMI 远程方法调用 (Remote Method Invocation)

    RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...

  8. Spring+EhCache缓存实例(具体解说+源代码下载)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有高速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  9. 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)

    一.粘包/拆包概念 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认 ...

随机推荐

  1. Laravel5.1 Middleware中间件(初级)

    中间件?什么鬼? 大家第一次接触这个词都会有这么个疑问,但它其实没那么神秘. 一句话就可以解释它:过滤HTTP请求专用机制. 为什么要使用中间件? 过滤HTTP请求是可以写在别的地方,比如说控制器中 ...

  2. kali linux下更新163源可使用RPM

    在没有安装163源之前 更新163源 1.在终端输入#leafpad /etc/apt/sources.list 2.打开网页 http://mirrors.163.com/.help/debian. ...

  3. wxPython安装使用

    https://wiki.wxpython.org/How to install wxPython pip install -U wxPython 验证版本 D:\python>python P ...

  4. nginx 在浏览器端保持cookie 一致

    一般来说,我们在java中都通过如下代码进行用户登录后的服务端注册,并且在用户下次请求时无需再登陆一遍,这就是Servlet的Session.使用了这种Session策略,那么Web容器比如tomca ...

  5. 1603 限高二叉排列树(计数DP)

    1603 限高二叉排列树 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   作为游戏魔方的编写者和管理员,Bob在很多主存模块中 ...

  6. (七)solr7之Terms组件的使用

    (七)solr7之Terms组件的使用 Terms组件提供访问索引项的字段和每个词相匹配的文档数量. 这可以用于建立一个自动建议特性或任何其他的特性,而这个terms不是搜索或文档级别的水平.快速检索 ...

  7. 九度OJ 1358:陈博的平均主义 (遍历、递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:354 解决:191 题目描述: 在JOBDU团队里,陈博是最讲平均主义的人了,但并不是像梁山好汉那样能够做到有钱同花,有肉同吃,毕竟,他还是 ...

  8. jquery lazyload延迟加载技术的实现原理分析_jquery

    前言 懒加载技术(简称lazyload)并不是新技术,它是js程序员对网页性能优化的一种方案.lazyload的核心是按需加载.在大型网站中都有lazyload的身影,例如谷歌的图片搜索页,迅雷首页, ...

  9. Pythonpika PhpAmqpLib rabbitmq服务中queues被清空的异常处理 无模式数据库对数据结构的定义和控制

    /** * Declares queue, creates if needed * * @param string $queue * @param bool $passive * @param boo ...

  10. 设计线程安全的类 VS 发布线程安全的对象

    一.设计线程安全的类 步骤: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 1.在现有的线程安全类中添加功能 (1)重用能减低工作量和提高正确性 (2)如果底层 ...