第八章 plugin插件加载

509 阅读1分钟

SkyWalking plugin插件加载

pluginFinder = new PluginFinder(new PluginBootstrap().loadPlugins() );

上面这行代码,要分为俩个部分

PluginBootstrap().loadPlugins()

/**
 * load all plugins.
 *
 * @return plugin definition list.
 */
public List<AbstractClassEnhancePluginDefine> loadPlugins() throws AgentPackageNotFoundException {
    //
    AgentClassLoader.initDefaultLoader();

    PluginResourcesResolver resolver = new PluginResourcesResolver();
    // 加载所有的skywalking-plugin.def资源文件
    List<URL> resources = resolver.getResources();

    if (resources == null || resources.size() == 0) {
        logger.info("no plugin files (skywalking-plugin.def) found, continue to start application.");
        return new ArrayList<AbstractClassEnhancePluginDefine>();
    }

    for (URL pluginUrl : resources) {
        try {
            // 加载所有的资源、将skywalking-plugin.def资源文件内的所有类进行初始化成PluginDefine描述对象, 并统一添加到pluginClassList 集合中
            // 在如果需要使用资源时,直接调用 PluginCfg.INSTANCE.getPluginClassList();
            PluginCfg.INSTANCE.load(pluginUrl.openStream());
        } catch (Throwable t) {
            logger.error(t, "plugin file [{}] init failure.", pluginUrl);
        }
    }
    // 加载到的资源集合
    List<PluginDefine> pluginClassList = PluginCfg.INSTANCE.getPluginClassList();
    // 初始化加载到的所有资源对象
    List<AbstractClassEnhancePluginDefine> plugins = new ArrayList<AbstractClassEnhancePluginDefine>();
    for (PluginDefine pluginDefine : pluginClassList) {
        try {
            logger.debug("loading plugin class {}.", pluginDefine.getDefineClass());
            //将加载得到的资源描述对象初始化AbstractClassEnhancePluginDefine 初始化对象,并添加到集合中
            AbstractClassEnhancePluginDefine plugin =
                (AbstractClassEnhancePluginDefine)Class.forName(pluginDefine.getDefineClass(),
                    true,
                    AgentClassLoader.getDefault()// jar包资源加载
                )
                    .newInstance();
            plugins.add(plugin);
        } catch (Throwable t) {
            logger.error(t, "load plugin [{}] failure.", pluginDefine.getDefineClass());
        }
    }

    plugins.addAll(DynamicPluginLoader.INSTANCE.load(AgentClassLoader.getDefault()));
    // 加载所有的插件。PluginBootstrap 完成所有的初始化工作。在将集合作为参数交给PluginFinder 对象
    return plugins;

}

new PluginFinder()

// 记录name类型的
private final Map<String, LinkedList<AbstractClassEnhancePluginDefine>> nameMatchDefine = new HashMap<String, LinkedList<AbstractClassEnhancePluginDefine>>();
// 其他类型的匹配
private final List<AbstractClassEnhancePluginDefine> signatureMatchDefine = new LinkedList<AbstractClassEnhancePluginDefine>();
// PluginFinder 构造方法将PluginBootstrap 加载的PluginBootstrap 集合 作为参数传入进来
// 将每个插件进行筛选分别存到 nameMatchDefine 和 signatureMatchDefine 集合容器中
public PluginFinder(List<AbstractClassEnhancePluginDefine> plugins) {
    for (AbstractClassEnhancePluginDefine plugin : plugins) {
        ClassMatch match = plugin.enhanceClass();

        if (match == null) {
            continue;
        }

        if (match instanceof NameMatch) {
            NameMatch nameMatch = (NameMatch)match;
            LinkedList<AbstractClassEnhancePluginDefine> pluginDefines = nameMatchDefine.get(nameMatch.getClassName());
            if (pluginDefines == null) {
                pluginDefines = new LinkedList<AbstractClassEnhancePluginDefine>();
                nameMatchDefine.put(nameMatch.getClassName(), pluginDefines);
            }
            pluginDefines.add(plugin);
        } else {
            signatureMatchDefine.add(plugin);
        }
    }
}

以上工作,相当于完成了,插件的准备工作。