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);
}
}
}
以上工作,相当于完成了,插件的准备工作。