1. 程式人生 > >Spring整合Hessian與分析

Spring整合Hessian與分析

前言

上一篇文章Hessian入門體驗與分析介紹了hessian的簡單入門,並且從原始碼層面對Hessian的呼叫流程進行了分析;發現使用原生的Hessian還是比較繁瑣的,下面看看Spring與Hessian進行整合並且進行簡要分析。

使用

提供三個模擬塊,分別模擬client,server以及被依賴的jar;對應的模組名稱分別是:hessianClient,hessianServer以及hessianJar

1.hessianJar介紹

hessianJar主要提供被hessianClient和hessianServer依賴的公共類,這裡主要提供了介面類IHessianService和pojo物件Bean

IHessianService類:

物件Bean:

2.hessianSever介紹

hessianServer主要用來對外提供服務的,因為hessian本身是基於http協議的,所以可以直接部署到web容器中比如tomcat,http協議解析可以直接交給web容器;此處因為將服務的釋出交給Spring來處理,提供配置檔案如下:

spring-server-hessian.xml:

web.xml:

HessianServiceImpl:

3.hessianClient介紹

hessianClient模擬客戶端的呼叫,對hessianSever發起請求,並且接受回覆;此處因為將客戶端的呼叫交給Spring來處理,提供配置檔案如下:

spring-client-hessian.xml:

HessianSpringClient:

部署測試

執行結果如下:

Spring整合Hessian呼叫分析

1.HessianProxyFactoryBean類

配置檔案spring-client-hessian.xml中定義的物件class都是HessianProxyFactoryBean類,而我們通過上一篇文章中瞭解到Hessian通過在客戶端使用動態代理的方式來實現RPC,HessianProxyFactoryBean程式碼如下:

發現HessianProxyFactoryBean實現了FactoryBean介面,而介面的方法getObject()正是我們在呼叫context.getBean(“x”)的時候被呼叫,所以獲取的bean其實是serviceProxy,通過ProxyFactory的getProxy方法獲取,具體程式碼如下:

serviceProxy其實是通過AopProxy獲取的代理類,AopProxy有兩個實現類分別是:CglibAopProxy和JdkDynamicAopProxy,分別對應的兩種動態代理方式,具體使用哪種,通過DefaultAopProxyFactory中如下程式碼來實現:

這裡使用的是JdkDynamicAopProxy,部分程式碼如下:

JdkDynamicAopProxy實現了InvocationHandler介面,每次在呼叫方法(如:hessianService.getString(“zhaohui”))時,自動觸發invoke方法;這裡將需要的引數比如:(target,method,args等)封裝到了ReflectiveMethodInvocation中,在ReflectiveMethodInvocation的proceed()方法中又呼叫了HessianProxyFactoryBean中的invoke()方法,部分程式碼如下:

其中最關注的是hessianProxy物件,這裡通過反射的方式呼叫了hessianProxy物件裡面的指定方法(比如:hessianService.getString(“zhaohui”)),hessianProxy物件在初始化HessianProxyFactoryBean的時候就初始化好了,具體程式碼如下:

這段程式碼有沒有很熟悉,就是上一篇文章Hessian入門體驗與分析中的客戶端程式碼,如下所示:

這裡的getServiceInterface()和getServiceUrl()正是我們在spring-client-hessian.xml為hessionServiceClient配置的兩個屬性,其實到這裡下面的流程就和上一篇文章Hessian入門體驗與分析中完全一樣了。

2.代理類HessianProxy

3.http請求類

4.傳送請求

5.伺服器端接受訊息

web.xml中配置了處理訊息的servlet:DispatcherServlet,在啟動伺服器並初始化DispatcherServlet的時候,載入了配置在spring-server-hessian.xml中的org.springframework.remoting.caucho.HessianServiceExporter;DispatcherServlet只是啟動一個對映的作用,真正的處理在

HessianServiceExporter類中,部分程式碼如下:

HessianServiceExporter在例項化的同時也初始化了HessianSkeleton物件;又進一步的將Inputstream封裝入HessianInput中,將Outputstream封裝入Hessian2Output中;接下來把HessianInput和Hessian2Output傳入HessianSkeleton中,訊息的讀取和回覆都交給HessianSkeleton來處理;後面的處理具體分析同Hessian入門體驗與分析中介紹的。

5.Client接受伺服器的回覆

總結

本文通過hessianJar,hessianClient已經hessianServer三個模組,提供了Spring整合Hessian的例項;通過與Spring的整合,簡化了開發;然後從程式碼層面將包裹在Hessian外層的Spring剝離,還原原始的Hessian呼叫。