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

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

posted on   荣锋亮  阅读(391)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-02-16 dremio prometheus监控
2021-02-16 java 几个不错的编译器
2021-02-16 blitz 全栈react 框架
2020-02-16 cube.js 学习 cli 命令
2020-02-16 cube.js 学习 cube 连接mongodb 试用三
2020-02-16 cube.js 学习 cube 连接mongodb 试用二
2019-02-16 Running Elixir in Docker Containers

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示