深入了解帆软报表系统的启动过程二

楼主
插件开发者

前面说到MainDesigner的main方法中通过ModuleContext来加载解析designer-startup.xml的。

下面详细说说具体过程。

1 ModuleContext位于fine-core.jar包下,com.fr.module.ModuleContext,看一下它的parseRoot方法

public static synchronized Module parseRoot(String var0) {
        assert StringUtils.isNotBlank(var0) && !var0.contains("..");

        var0 = "/com/fr/config/starter/" + var0;
        Module var1 = FineModuleParser.parse(var0);
        ModuleContext.ModuleAccessor.init(var1);
        return var1;
    }

这里看到实际的解析是由FineModuleParser来完成的。

2 com.fr.module.engine.build.FineModuleParser的parse方法:

 public static Module parse(String var0) {
        ModuleConfig var1 = ModuleConfigFactory.create().downParse(var0);
        return var1 == null ? null : ModuleBuilder.build(var1);
    }

可以看到将配置文件的内容封装到ModuleConfig对象中了。然后使用ModuleBuilder来build模块.

3 com.fr.module.engine.build.ModuleBuilder的build方法

        

 static FineModule build(ModuleConfig var0) {
        FineModule var1 = build(var0, (Module)null);
        if (var1 == null) {
            return null;
        } else {
            finishLink(var1);
            ActivatorExtension.executePrepare(var1);
            return var1;
        }
    }

       从上面可以看出,先调用内部的build方法得到根模块,finishLink是将所有的模块用链表的格式连接起来。ActivatorExtension.executePrepare(var1),是如果activator实现了com.fr.module.extension.Prepare接口,就调用一下prepare方法,这个接口的作用是在调用activator的start方法前做一些准备工作。

看一下内部的 build方法:

        

private static FineModule build(ModuleConfig var0, Module var1) {
        Activator var2;
        try {
            var2 = createActivator(var0.getAttribute(ModuleAttribute.Activator));
        } catch (ClassNotFoundException var4) {
            FineLoggerFactory.getLogger().debug("Module not found {}", new Object[]{var0.getName()});
            return null;
        } catch (Throwable var5) {
            logError(var0, var5);
            return null;
        }

        FineModule var3 = FineModule.create(var0.getName(), var2, var1, var0.getAttributes());
        buildChildren(var3, var0);
        return var3;
    }

从上面可以看出,首先创建Activator实例,然后创建module,然后再构建子module。

看一下createActivator:

        

 private static Activator createActivator(String var0) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        if (StringUtils.isBlank(var0)) {
            return new VirtualActivator();
        } else {
            Class var1 = Class.forName(var0);
            return (Activator)var1.newInstance();
        }
    }

这很简单,就是根据类名来创建实例.

看一下FineModule.create

public FineModule(@NotNull String var1, @NotNull Activator var2, @Nullable Module var3, @NotNull Map<ModuleAttribute, String> var4) {
        assert StringUtils.isNotBlank(var1);

        this.name = var1;
        this.activator = var2;
        this.parent = var3;
        this.attributes = var4;
        this.invokeSubStrategy = InvokeSubStrategyFactory.create(this.getAttribute(ModuleAttribute.InvokeSubsStrategy));
        this.runner = new FineModule.FineModuleRunner();
    }

    public static FineModule create(@NotNull String var0, @NotNull Activator var1, @Nullable Module var2, @NotNull Map<ModuleAttribute, String> var3) {
        FineModule var4 = new FineModule(var0, var1, var2, var3);
        ContextImpl.createAndAttach(var4);
        return var4;
    }

上面可以看出是直接new一个FineModule实例与这个Activator实例关联上,然后这个module又与一个Context关联上,Context的概念后面讲,看看Context是如何跟Module关联的。

 public static void createAndAttach(FineModule var0) {
        ContextImpl var1 = new ContextImpl();
        var1.attach(var0);
    }
    private void attach(FineModule var1) {
        this.setModule(var1);
        var1.attachContext(this);
        var1.getActivator().attachContext(this);
        this.executor = new FineExecutorImpl(var1.getClass());
        if (this.isRoot()) {
            this.validators = new ConcurrentHashMap(4);
        } else {
            this.validators = null;
        }

        var1.onStop(new ListenerAdaptor() {
            protected void on(Event var1) {
                ContextImpl.this.executor.shutdownThreadPool();
            }
        });
    }

从上面看出,也是new一个ContextImpl实例来与这个Module实例关联的,activator又与Context实例关联上。

从上面看出这里有三个概念,Module,Activator,Context,这三者通过上面的过程就关联上了。

 

更多内容:https://blog.csdn.net/sixingbugai?spm=1000.2115.3001.5343

分享扩散:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0回帖数 1关注人数 2533浏览人数
最后回复于:2021-9-7 10:22

返回顶部 返回列表