Singleton Service Model in HiveMind

来源:互联网 发布:下一个风口行业 知乎 编辑:程序博客网 时间:2024/05/16 17:57

    在Singlenton这种模式下,当一个服务第一次被请求的时候,这个服务的一个代理将会被生成。生成的这个代理实现了与实际服务相同的接口(也可以是对象),并且在服务接口的方法在第一次被调用的时候实际的服务对象(包括服务的实现类,拦截机,对别的服务的引用等)才会真正被创建。
    HiveMind内部通过SingletonServiceModel这个类来完成服务代理的生成和实际服务创建的工作。代理的生成主要利用了javassit包提供的代码生成功能,动态的生成一个实现了所有服务接口方法的对象。
    生成的代理(proxy)分为内外两层,以下称外层代理为_deferredProxy,内层代理为_innerProxy。外层代理主要用于与用户代码交互或由其它服务引用,简单点说就是用户程序实际访问的对象。内层的主要任务是当服务接口的某个方法第一次被访问的时候生成实际的服务类并替换掉自己。在之后的调用将是通过外层代理直接调用实际服务类(如果服务接口定义的是一个实际类的话,还会为这个类生成Bridge的一个包装类),而不必经过内层代理的中转。
比如有如下的接口和实现类:
public interface Person{
    String getName();
}

public class Hawk{
    String getName(){
        return "Hawk";
    }
}

在第一次请求服务之后会生成如下的两个代理类:
//_deferredProxy
public class $Person_0 implements Person,RegistryShutdownListener{
    private Person _inner;
    private boolean _shutdown;
    public final void registryDidShutdown(){
        _shutdown = true;
    }
    public synchronized final void _setInner(Person inner){
        _inner = inner;
    }
    private Person _getInner(){
        if (_shutdown)
            _inner = null;
        throw org.apache.hivemind.HiveMind.createRegistryShutdownException();
        return _inner;
    }
    //添加服务接口中的方法
    public String getName(){
        return (String)_getInner().getName();
    }
}
//innerProxy
public class $Person_1 implements Person{
    private $Person_0 _deferredProxy;
    private Person _service;
    private SingletonServiceModel _serviceModel;
    pbulic $Person_1($Person_0 deferredProxy,SingletonServiceModel serviceModel){
        _deferredProxy = deferredProxy;
        _serviceModel = serviceModel;
        _deferredProxy._setInner(this);
    }
    private synchronized final Person _service(){
        if (_service == null)
            _service = (Person))_serviceModel.getActualServiceImplementation();
        //在这里改变了外层代理的_inner属性值,指向实际服务对象(或桥连对象)
        _deferredProxy._setInner(_service);
        return _service;
    }
    public final_instantiateServiceImplementation(){
        _service();
    }
    //添加服务接口中的方法
    public String getName(){
        return (String)_service().getName();
    }
    通过上面的例子可以看到HiveMind是如何动态为Singleton模式的服务类生成代理的,通过两层代理间的方向调用完成了在第一次请求服务接口方法的时候生成实际对象。这种方法生成代理的好处是没有动态调用,只在第一次请求或调用服务方法的时候需要额外的系统时间来生成代理类,其它时间都是直接调用。 

原创粉丝点击