最近,研究了一下平台远程调用的过程,和service层插件执行的原理,记录一下。
1、远程service调用过程
首先看一下类的继承结构
封装调用处理过程
封装service调用接口
封装service请求信息
封装请求信息处理类
先描述一个调用过程:
平台在controller里面获取service的时候都是通过lookup方式(就是用了spring查找service的bean对象的代理对象),远程的service配到配置文件里面,所以在lookup的时候,如果配置文件中有的service,返回代理对象的时候,InvocationHandler其实是子类RemoteInvocationHandler,如果是本地service,那InvocationHandler其实是子类LocalInvocationHandler.
service执行相关方法的时候,调用的是AbstractInvocationHandler的invoke方法,这个方法做什么呢?这个方法封装ServiceRequest对象,如果是远程service,其实就是RemoteServiceRequest,本地service的话是LocalServiceRequest对象,然后调用ServiceInvoker的invokeService方法,参数就是ServiceRequest对象。
ServiceInvoker的invokeService方法做什么呢?这个方法里面调用AbstractServiceRequestHandler的handleReuqest方法,参数为ServiceRequest对象。根据ServiceRequest对象就能知道是否为远程请求,若是,AbstractServiceRequestHandler实例其实指向的是RemoteServiceRequestHandler对象。
2、service层插件执行
这个其实就是在上面所述的AbstractServiceRequestHandler的handleReuqest方法中,找到方法执行前的插件,方法执行后的插件,都执行了一遍。插件就是在service方法执行前后要进行的一些逻辑处理。
终于理清了思路,记录一下。
spring代理模式 service远程调用,插件执行的更多相关文章
-
Spring代理模式及AOP基本术语
一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...
-
Spring 代理模式及AOP基本术语
一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...
-
Spring代理模式(jdk动态代理模式)
有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...
-
Spring集成RMI实现远程调用
前提: 1.开发工具: jdk tomcat ecplise,开发工具的使用本篇不做介绍. 2.需具备以下知识:javase servelt web rmi spring maven 一.关于RMI ...
-
Spring代理模式(CGLIB动态代理模式)
jdk动态代理和CGLIB动态代理 没什么太大的区别,CGLIB动态代理不需要接口,但是需要导入jar包. 房东出租房子的方法: package com.bjsxt.proxy2; public cl ...
-
SPRING代理模式
1.静态代理 主题对象:Student public interface Student { public String add(); } 目标对象:RealStudent public class ...
-
《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用
1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端 ...
-
【spring源码学习】spring的远程调用实现源码分析
[一]spring的远程调用提供的基础类 (1)org.springframework.remoting.support.RemotingSupport ===>spring提供实现的远程调用客 ...
-
Spring远程调用技术<;3>;-Spring的HTTP Invoker
前面提到RMI使用java标准的对象序列化机制,但是很难穿透防火墙. 另一方面,Hessian和Burlap能很好地穿透防火墙,但是使用私有的对象序列化机制. Spring提供的http invke ...
随机推荐
-
mount挂载问题
安装nfs-utils即可
-
sphinx使用小记之使用小结
sphinx使用小记之使用小结 摘自:http://www.68idc.cn/help/jiabenmake/qita/20150124187789.html 在使用sphinx的过程中有出现一些问题 ...
-
Delphi内嵌汇编语言BASM精要(转帖)
1 BASM概念简要 汇编语句由指令和零至三个表达式构成.表达式由常数(立即数).寄存器和标识符构成.例如: movsb // 单指令语句 jmp @Here // 一个表达式: ...
-
Windows server 2012清除并重建SID
首先介绍下什么是SID SID也就是安全标识符(Security Identifiers),是标识用户.组和计算机帐户的唯一的号码.在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID. ...
-
c++ assert
#include<iostream> #include <assert.h> using namespace std; int main() { ; assert(a == ) ...
-
UVa 10285 - Longest Run on a Snowboard
称号:给你一个二维矩阵,找到一个点.每一个可以移动到的位置相邻的上下,求最长单调路径. 分析:贪婪,dp.搜索. 这个问题是一个小样本,我们该怎么办. 这里使用贪心算法: 首先.将全部点依照权值排序( ...
-
Maven服务器
Maven私服仓库管理: Nexus 3.0 使用nexus3.X搭建maven私服在Centos7环境中-详细教程
-
jscript定时器,一直用的东西,你真的明白吗?
JavaScript定时器 JavaScript是一种解释型语言(边编译边执行),Js解析顺序是从上到下,然后将编译后的任务丢到一个事件队列中,然后事件内的函数会从上到下开始执行 setInterva ...
-
redis conf 中文详解
# Redis示例配置文件 # 注意单位问题:当需要设置内存大小的时候,可以使用类似1k.5GB.4M这样的常见格式: # # 1k => 1000 bytes # 1kb => 1024 ...
-
Linux - rar 压缩
Linux - rar yum -y install libstdc++.so. wget http://rarsoft.com/rar/rarlinux-4.0.1.tar.gz cd rar ma ...