天天看点

Primitive Service Model and Interceptor in HiveMind

    在Singlenton这种模式下,当一个服务第一次被请求的时候,这个服务的一个代理将会被生成。生成的这个代理实现了与实际服务相同的接口(也可以是对象),并且在服务接口的方法在第一次被调用的时候实际的服务对象(包括服务的实现类,拦截机,对别的服务的引用等)才会真正被创建。

    HiveMind内部通过SingletonServiceModel这个类来完成服务代理的生成和实际服务创建的工作。代理的生成主要利用了javassit包提供的代码生成功能,动态的生成一个实现了所有服务接口方法的对象。

    生成的代理(proxy)分为内外两层,以下称外层代理为_deferredProxy,内层代理为_innerProxy。外层代理主要用于与用户代码交互或由其它服务引用,简单点说就是用户程序实际访问的对象。内层的主要任务是当服务接口的某个方法第一次被访问的时候生成实际的服务类并替换掉自己。在之后的调用将是通过外层代理直接调用实际服务类(如果服务接口定义的是一个实际类的话,还会为这个类生成Bridge的一个包装类),而不必经过内层代理的中转。

比如有如下的接口和实现类:

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

public   interface  Person ... {

Primitive Service Model and Interceptor in HiveMind

    String getName();

Primitive Service Model and Interceptor in HiveMind

}

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

public   class  Hawk ... {

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    String getName()...{

Primitive Service Model and Interceptor in HiveMind

        return "Hawk";

Primitive Service Model and Interceptor in HiveMind

    }

Primitive Service Model and Interceptor in HiveMind

}

在第一次请求服务之后会生成如下的两个代理类:

Primitive Service Model and Interceptor in HiveMind

// _deferredProxy

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

public   class  $Person_0  implements  Person,RegistryShutdownListener ... {

Primitive Service Model and Interceptor in HiveMind

    private Person _inner;

Primitive Service Model and Interceptor in HiveMind

    private boolean _shutdown;

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    public final void registryDidShutdown()...{

Primitive Service Model and Interceptor in HiveMind

        _shutdown = true;

Primitive Service Model and Interceptor in HiveMind

    }

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    public synchronized final void _setInner(Person inner)...{

Primitive Service Model and Interceptor in HiveMind

        _inner = inner;

Primitive Service Model and Interceptor in HiveMind

    }

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    private Person _getInner()...{

Primitive Service Model and Interceptor in HiveMind

        if (_shutdown)

Primitive Service Model and Interceptor in HiveMind

            _inner = null;

Primitive Service Model and Interceptor in HiveMind

        throw org.apache.hivemind.HiveMind.createRegistryShutdownException();

Primitive Service Model and Interceptor in HiveMind

        return _inner;

Primitive Service Model and Interceptor in HiveMind

    }

Primitive Service Model and Interceptor in HiveMind

    //添加服务接口中的方法

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    public String getName()...{

Primitive Service Model and Interceptor in HiveMind

        return (String)_getInner().getName();

Primitive Service Model and Interceptor in HiveMind

    }

Primitive Service Model and Interceptor in HiveMind

}

Primitive Service Model and Interceptor in HiveMind

// innerProxy

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

public   class  $Person_1  implements  Person ... {

Primitive Service Model and Interceptor in HiveMind

    private $Person_0 _deferredProxy;

Primitive Service Model and Interceptor in HiveMind

    private Person _service;

Primitive Service Model and Interceptor in HiveMind

    private SingletonServiceModel _serviceModel;

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    pbulic $Person_1($Person_0 deferredProxy,SingletonServiceModel serviceModel)...{

Primitive Service Model and Interceptor in HiveMind

        _deferredProxy = deferredProxy;

Primitive Service Model and Interceptor in HiveMind

        _serviceModel = serviceModel;

Primitive Service Model and Interceptor in HiveMind

        _deferredProxy._setInner(this);

Primitive Service Model and Interceptor in HiveMind

    }

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    private synchronized final Person _service()...{

Primitive Service Model and Interceptor in HiveMind

        if (_service == null)

Primitive Service Model and Interceptor in HiveMind

            _service = (Person))_serviceModel.getActualServiceImplementation();

Primitive Service Model and Interceptor in HiveMind

        //在这里改变了外层代理的_inner属性值,指向实际服务对象(或桥连对象)

Primitive Service Model and Interceptor in HiveMind

        _deferredProxy._setInner(_service);

Primitive Service Model and Interceptor in HiveMind

        return _service;

Primitive Service Model and Interceptor in HiveMind

    }

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    public final_instantiateServiceImplementation()...{

Primitive Service Model and Interceptor in HiveMind

        _service();

Primitive Service Model and Interceptor in HiveMind

    }

Primitive Service Model and Interceptor in HiveMind

    //添加服务接口中的方法

Primitive Service Model and Interceptor in HiveMind
Primitive Service Model and Interceptor in HiveMind

    public String getName()...{

Primitive Service Model and Interceptor in HiveMind

        return (String)_service().getName();

Primitive Service Model and Interceptor in HiveMind

    }

    通过上面的例子可以看到HiveMind是如何动态为Singleton模式的服务类生成代理的,通过两层代理间的方向调用完成了在第一次请求服务接口方法的时候生成实际对象。这种方法生成代理的好处是没有动态调用,只在第一次请求或调用服务方法的时候需要额外的系统时间来生成代理类,其它时间都是直接调用。