PF4J源码分析

序言

  • PF4J版本:2.6.0

由于PF4J是非常轻量级的框架,这代表着该框架内包含的接口、抽象类、工具类等的数量可能很容易令人接受。所以在学习过程中,我把所有类和接口等之间的关系通过图形罗列了出来。之后再对每一部分做总结。
在这里插入图片描述

ExtensionFinder

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

        return extensionFinder;
    }

PF4J通过PluginManager持有一个DefaultExtensionFinder对象,

public DefaultExtensionFinder(PluginManager pluginManager) {
        this.pluginManager = pluginManager;

        add(new LegacyExtensionFinder(pluginManager));
//        add(new ServiceProviderExtensionFinder(pluginManager));
    }

DefaultExtensionFinder的构造器接收PluginManager作为参数,DefaultExtensionFinder内部持有一个用来存放ExtensionFinder的List容器finders,该版本中finders存放的是LegacyExtensionFinder。

@Override
    public Map<String, Set<String>> readPluginsStorages() {
        log.debug("Reading extensions storages from plugins");
        Map<String, Set<String>> result = new LinkedHashMap<>();

        List<PluginWrapper> plugins = pluginManager.getPlugins();
        for (PluginWrapper plugin : plugins) {
            String pluginId = plugin.getDescriptor().getPluginId();
            log.debug("Reading extensions storage from plugin '{}'", pluginId);
            Set<String> bucket = new HashSet<>();

            try {
                Enumeration<URL> urls = ((PluginClassLoader) plugin.getPluginClassLoader()).findResources(getExtensionsResource());
                if (urls.hasMoreElements()) {
                    collectExtensions(urls, bucket);
                } else {
                    log.debug("Cannot find '{}'", getExtensionsResource());
                }

                debugExtensions(bucket);

                result.put(pluginId, bucket);
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
        }

        return result;
    }

LegacyExtensionFinder.readPluginsStorages()方法会从META-INF/extensions.idx读取到插件内的全限定名类文件。

springboot集成pf4j是一种实现插件化开发的方式。在这种集成中,使用了pf4j-spring框架和自定义的pf4j-spring-core模块来扩展pf4j的功能,并提供了pf4j-manager-spring-boot-starter作为spring-boot的配置类和配置项。这样可以在spring-boot应用中轻松地管理和加载插件。 具体来说,项目中的pf4j-spring模块是PF4J的spring版本,但没有与spring-boot集成。为了满足需求,新建了pf4j-spring-core模块,与pf4j-spring几乎一致,但修改了部分实现。而pf4j-manager-spring-boot-starter提供了spring-boot的配置类和配置项。 在项目的结构中,主应用是manager模块,它是一个spring-boot web应用。sdk模块定义了插件的扩展点。而plugins目录下有三个插件和四个扩展功能。 要运行Demo,可以使用命令"git clone https://github.com/clyoudu/pf4j-spring.git"克隆项目。 综上所述,springboot集成pf4j是一种在spring-boot应用中实现插件化开发的方法,通过使用pf4j-spring框架和自定义的pf4j-spring-core模块来扩展pf4j的功能,并提供了pf4j-manager-spring-boot-starter作为spring-boot的配置类和配置项。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【借助pf4j实现基于spring-boot的插件化开发](https://blog.csdn.net/CL_YD/article/details/128836481)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JAVA单例模式源码-pf4j-spring:Spring插件框架(PF4J-Spring框架集成)](https://download.csdn.net/download/weixin_38499336/19398119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值