ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pf4j 默认系统扩展以及机制说明

2022-02-16 19:36:09  阅读:197  来源: 互联网

标签:Map pf4j bucket 扩展 默认 result new pluginManager LegacyExtensionFinder


pf4j 支持直接在应用中进行插件的开发以及运行(不需要复杂的处理)
与serviceloader 比较类似,我么只需要添加一个注解就可以了(@Extension)

参考运行

 
public static void main(String[] args) {
    PluginManager pluginManager = new DefaultPluginManager();
   //  pluginManager.loadPlugins();
   // pluginManager.startPlugins();
    List<Greeting> greetings = pluginManager.getExtensions(Greeting.class);
    for (Greeting greeting : greetings) {
        System.out.println(">>> " + greeting.getGreeting());
    }
}

实现原理

主要是 DefaultPluginManager 的默认实现,包含的一个createExtensionFinder方法

@Override
protected ExtensionFinder createExtensionFinder() {
    DefaultExtensionFinder extensionFinder = new DefaultExtensionFinder(this);
    addPluginStateListener(extensionFinder);
 
    return extensionFinder;
}

默认实现的处理,添加了一个自己的LegacyExtensionFinder

public DefaultExtensionFinder(PluginManager pluginManager) {
    this.pluginManager = pluginManager;
   // 添加默认的LegacyExtensionFinder 
    add(new LegacyExtensionFinder(pluginManager));
//        add(new ServiceProviderExtensionFinder(pluginManager));
}

LegacyExtensionFinder class 查找处理,使用了基类的 AbstractExtensionFinder.java

private Map<String, Set<String>> readStorages() {
        Map<String, Set<String>> result = new LinkedHashMap<>();
 
        result.putAll(readClasspathStorages());
        result.putAll(readPluginsStorages());
 
        return result;
}

LegacyExtensionFinder readClasspathStorages 实现处理,先直接查询的classpath,就能确保使用应用的扩展接口

public Map<String, Set<String>> readClasspathStorages() {
    log.debug("Reading extensions storages from classpath");
    Map<String, Set<String>> result = new LinkedHashMap<>();
 
    Set<String> bucket = new HashSet<>();
    try {
        Enumeration<URL> urls = getClass().getClassLoader().getResources(EXTENSIONS_RESOURCE);
        if (urls.hasMoreElements()) {
            collectExtensions(urls, bucket);
        } else {
            log.debug("Cannot find '{}'", EXTENSIONS_RESOURCE);
        }
 
        debugExtensions(bucket);
 
        result.put(null, bucket);
    } catch (IOException e) {
        log.error(e.getMessage(), e);
    }
 
    return result;
}

参考资料

https://pf4j.org/doc/system-extension.html

标签:Map,pf4j,bucket,扩展,默认,result,new,pluginManager,LegacyExtensionFinder
来源: https://www.cnblogs.com/rongfengliang/p/15902000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有