1.创建代理类:
在前端一般调用
HessianProxyFactory.create(Class serviceInterface,String url),获取对后台service的一个代理访问类对象;
HessianProxyFactory.create方法的内部是这样做的:
URL url = new URL(urlName); handler = new HessianProxy(this, url); return Proxy.newProxyInstance(loader, new Class[] { api, HessianRemoteObject.class }, handler);
其中 Proxy.newProxyInstance 为Jdk提供的创建动态代理的工具类,
api即为我们传入的,后端会实现的service的接口,
loader为加载api,和HessianRemoteObject.class两个类所需要的ClassLorder,
handler其实为回调类,重点其实在这里,完成了相应远程方法的调用,以及参数的序列化;
2.远程方法调用:
第一步创建完动态代理类后,我们就得到了一个貌似对与后端类的引用,其实只是一个披着serviceInterface外衣的动态代理对象而已,当调用serviceInterface接口定义的相应方法时,
动态代理类就会去调用HessianProxy中定义的方法:
public Object invoke(Object proxy, Method method, Object[] args)
在这个方法中,有调用
conn = sendRequest(mangleName, args);
在sendRequest方法中完成一次对后台的请求:如下
URLConnection conn = this._factory.openConnection(this._url); os = conn.getOutputStream(); AbstractHessianOutput out = this._factory.getHessianOutput(os); out.call(methodName, args); out.flush();
3.过滤器拦截请求:
我们在web.xml里已经定义的过滤器,会拦截此次请求,然后调用相应的后端程序,然后,将结果序列化,返回。
4.前端 HessianProxy 中对返回结果进行反序列化,返回给业务程序
所以最重要的过程,对通讯过程的封装都是由 HessianProxy 完成,形成了前端调用后端程序,如后端调用后端一样简单的效果。