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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用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