美文网首页
hsf笔记-ContainerBase和XComponent

hsf笔记-ContainerBase和XComponent

作者: 兴浩 | 来源:发表于2018-08-22 16:53 被阅读11次

1.XComponent

XComponent可以理解为某个类的附属定向服务,关联性更强

如下3个接口

  • ApplicationComponent对应ApplicationModel
  • ServiceComponent对应ServiceMetadata
  • FrameworkComponent对应FrameworkModel
public interface XComponent {
    String name();
}
public interface ApplicationComponent extends XComponent {
    void init(ApplicationModel var1);
}
public interface ServiceComponent extends XComponent {
    void init(ServiceMetadata var1);
}
public interface FrameworkComponent extends XComponent {
    void init();
}

2. ContainerBase

ContainerBase提供了XComponent的基本操作,所以例如ApplicationModel添加XComponent的操作也继承自ContainerBase

public abstract class ContainerBase {
    protected ContainerBase parent;
    protected Map<String, XComponent> componentMap = new LinkedHashMap();

    public ContainerBase(ContainerBase parent) {
        this.parent = parent;
    }

    public XComponent getComponent(String name) {
        XComponent component = null;
        if (StringUtils.isNotBlank(name)) {
            component = (XComponent)this.componentMap.get(name);
            if (component == null && this.parent != null) {
                component = this.parent.getComponent(name);
            }
        }

        return component;
    }

    public abstract void init();
}

看以下三个例子,基本大同小异

2.1 ApplicationModel

public class ApplicationModel extends ContainerBase {
    
    public ApplicationModel(String name, ClassLoader appContextClassLoader, boolean isBiz) {
        super(frameworkModel);
        
        List<ApplicationComponent> applicationComponents = this.serviceContainer.getInstances(ApplicationComponent.class);
        Iterator i$ = applicationComponents.iterator();

        while(i$.hasNext()) {
            ApplicationComponent component = (ApplicationComponent)i$.next();
            this.componentMap.put(component.name(), component);
        }

    }

2.2 FrameworkModel

public class FrameworkModel extends ContainerBase {
    public FrameworkModel() {
        super((ContainerBase)null);
        this.init();
    }

    public void init() {
        List<FrameworkComponent> components = HSFServiceContainer.SHARED_CONTAINER.getInstances(FrameworkComponent.class);
        Iterator i$ = components.iterator();

        while(i$.hasNext()) {
            FrameworkComponent component = (FrameworkComponent)i$.next();
            component.init();
            this.componentMap.put(component.name(), component);
        }

    }
}

2.3 ServiceMetadata

public class ServiceMetadata extends ContainerBase {
    public synchronized void init() {
        List<ServiceComponent> components = this.applicationModel.getServiceContainer().
getInstances(ServiceComponent.class, this.isProvider ? new String[]{"provider"} : new String[]{"consumer"});
            Iterator i$ = components.iterator();
            while(i$.hasNext()) {
                ServiceComponent component = (ServiceComponent)i$.next();
                component.init(this);
                this.componentMap.put(component.name(), component);
            }
    }
}

相关文章

网友评论

      本文标题:hsf笔记-ContainerBase和XComponent

      本文链接:https://www.haomeiwen.com/subject/voyyiftx.html