最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pf4j spring 集成幾個(gè)問題記錄

 更新時(shí)間:2026年03月16日 09:39:41   作者:Jeffcky  
文章介紹了在使用pf4j和Spring框架時(shí)遇到的一些問題及其解決方法,包括類加載器沖突、Bean注入問題、父子Spring上下文的使用以及擴(kuò)展類的處理,感興趣的朋友跟隨小編一起看看吧

以下整理幾個(gè)實(shí)際使用碰到的問題

問題

  • Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/pf4j/PluginClassLoader) previously initiated loading for a different type with name "org/springframework/context/ApplicationContext"

移除spring core ,在插件項(xiàng)目中對(duì)于spring 的依賴設(shè)置為provide

  • org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'jdbcTemplate' is expected to be of type 'org.springframework.jdbc.core.JdbcTemplate' but was actually of type 'org.springframework.jdbc.core.JdbcTemplate'

與上邊一個(gè)問題一樣,不然會(huì)有莫名的問題

  • bean 注入問題

官方提供了SpringPluin 抽象 ,此類可以解決spring context 的創(chuàng)建以及一些依賴處理,一般的玩法是自己創(chuàng)建一個(gè),同時(shí)對(duì)于需要
注意的beans在此對(duì)象中注冊(cè)
參考
PluginBConfig 為一個(gè)Configuration ,可以聲明我們需要的bea

public class PluginB extends SpringPlugin {
    public PluginB(PluginWrapper wrapper) {
        super(wrapper);
    }
    @Override
    protected ApplicationContext createApplicationContext() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.setClassLoader(getWrapper().getPluginClassLoader());
        applicationContext.register(PluginBConfig.class);
        applicationContext.refresh();
        return applicationContext;
    }
}
  • 基于父子spring context 解決bean 共享問題
    場(chǎng)景,比如bootstrap 提供datasource,插件直接使用此datasource
    默認(rèn)pf4j spring 只能使用自己插件里邊包含的bean,對(duì)于添加了Extension 注解的擴(kuò)展類,可以暴露為一個(gè)直接spring bean
    pf4j-spring/src/main/java/org/pf4j/spring/ExtensionsInjector.java
protected void registerExtension(Class<?> extensionClass) {
    Map<String, ?> extensionBeanMap = springPluginManager.getApplicationContext().getBeansOfType(extensionClass);
    if (extensionBeanMap.isEmpty()) {
        Object extension = springPluginManager.getExtensionFactory().create(extensionClass);
        beanFactory.registerSingleton(extensionClass.getName(), extension); // 使用了bootstrap 的applicationcontext
    } else {
        log.debug("Bean registeration aborted! Extension '{}' already existed as bean!", extensionClass.getName());
    }
}

此擴(kuò)展在bootstrap 的applicationcontext 中注冊(cè),對(duì)于插件同時(shí)也包含一個(gè)createApplicationContext,在此處我們可以i基于
spring 的context 父子關(guān)系解決插件共享bootstrap bean 的問題
參考代碼

public class pluginC extends SpringPlugin {
    public pluginC(PluginWrapper wrapper) {
        super(wrapper);
    }
    @Override
    protected ApplicationContext createApplicationContext() {
         // 先獲取SpringPluginManager 的ApplicationContext,也就是bootstrap 的ApplicationContext
        ApplicationContext applicationContextRoot  = ((SpringPluginManager)getWrapper().getPluginManager()).getApplicationContext();
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.setClassLoader(getWrapper().getPluginClassLoader());
        // 設(shè)置父applicationtext
        applicationContext.setParent(applicationContextRoot);
        applicationContext.register(PluginCConfig.class);
        applicationContext.refresh();
        return applicationContext;
    }
}

注意一個(gè)問題,將spring 依賴設(shè)置為provide,不然會(huì)有上邊2的問題,注意共享bean是子能訪問父,父不能訪問子(spring 約定)
如果需要訪問,推薦放到服務(wù)契約中,在插件中開發(fā)實(shí)現(xiàn),讓SpringPluginManager 自己進(jìn)行bean 注冊(cè)到父中,而且此bean在插件中
也可以直接訪問

參考資料

https://github.com/pf4j/pf4j/issues/93

https://github.com/rongfengliang/pf4j-spring-learning/tree/classloader-test

到此這篇關(guān)于pf4j spring 集成幾個(gè)問題的文章就介紹到這了,更多相關(guān)pf4j spring 集成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?Runtime的使用詳解

    Java?Runtime的使用詳解

    這篇文章主要介紹了Java?Runtime的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring web集成rabbitmq代碼實(shí)例

    Spring web集成rabbitmq代碼實(shí)例

    這篇文章主要介紹了Spring web集成rabbitmq代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java的并發(fā)編程之CyclicBarrier解析

    Java的并發(fā)編程之CyclicBarrier解析

    這篇文章主要介紹了Java的并發(fā)編程之CyclicBarrier解析,CyclicBarrier支持一個(gè)可選的Runnable命令,在一組線程中的最后一個(gè)線程到達(dá)之后(但在釋放所有線程之前),該命令只在每個(gè)屏障點(diǎn)運(yùn)行一次,需要的朋友可以參考下
    2023-11-11
  • 在idea中創(chuàng)建SpringBoot項(xiàng)目

    在idea中創(chuàng)建SpringBoot項(xiàng)目

    這篇文章主要介紹了在idea中創(chuàng)建SpringBoot項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • java中幾種常用的HTTP請(qǐng)求工具類舉例詳解

    java中幾種常用的HTTP請(qǐng)求工具類舉例詳解

    這篇文章主要介紹了java中幾種常用的HTTP請(qǐng)求工具類,詳細(xì)對(duì)比了OkHttp、Hutool和RestTemplate三種HTTP客戶端工具類的性能和適用場(chǎng)景,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2025-05-05
  • 消息隊(duì)列MQ使用詳解

    消息隊(duì)列MQ使用詳解

    消息隊(duì)列(MQ)是一種基于“先進(jìn)先出”原則的數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于分布式系統(tǒng)中,主要用于應(yīng)用解耦、異步消息處理和流量削峰,消息隊(duì)列中間件通過允許生產(chǎn)者發(fā)送消息到隊(duì)列,消費(fèi)者從隊(duì)列中拉取消息或訂閱消息,實(shí)現(xiàn)高效、可擴(kuò)展和最終一致性的系統(tǒng)架構(gòu)
    2024-10-10
  • 全網(wǎng)最新springboot整合mybatis-plus的過程

    全網(wǎng)最新springboot整合mybatis-plus的過程

    在本文中,介紹了 MyBatis-Plus 的核心功能和使用方法,包括如何配置分頁插件、編寫分頁查詢代碼、使用各種 Wrapper 構(gòu)建復(fù)雜查詢條件等,通過這些內(nèi)容,相信你已經(jīng)對(duì) MyBatis-Plus 有了更深入的了解,并能夠在實(shí)際項(xiàng)目中靈活應(yīng)用這些功能,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • Java中和隊(duì)列相關(guān)的基本操作

    Java中和隊(duì)列相關(guān)的基本操作

    在Java中,隊(duì)列是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和管理元素。Java提供了Queue接口和其實(shí)現(xiàn)類,包括LinkedList和ArrayDeque等。隊(duì)列的基本操作包括入隊(duì)(enqueue)、出隊(duì)(dequeue)、獲取隊(duì)首元素(peek)和判斷隊(duì)列是否為空(isEmpty)。
    2023-09-09
  • MyBatis typeAliases元素標(biāo)簽(含注解方式)及其屬性、設(shè)置方式

    MyBatis typeAliases元素標(biāo)簽(含注解方式)及其屬性、設(shè)置方式

    這篇文章主要介紹了MyBatis typeAliases元素標(biāo)簽(含注解方式)及其屬性、設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • struts2自定義攔截器的示例代碼

    struts2自定義攔截器的示例代碼

    本篇文章主要介紹了struts2自定義攔截器的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08

最新評(píng)論

郴州市| 突泉县| 宁阳县| 九龙坡区| 茶陵县| 土默特右旗| 凌云县| 乌拉特后旗| 云龙县| 吉木乃县| 大足县| 凤翔县| 葵青区| 长寿区| 凭祥市| 木里| 昌江| 正定县| 凌海市| 延长县| 清新县| 和田市| 栾川县| 简阳市| 桃源县| 桦南县| 手机| 古蔺县| 永泰县| 泸西县| 长岭县| 那曲县| 北票市| 潮州市| 通渭县| 文山县| 巴彦淖尔市| 城口县| 图片| 闻喜县| 宜黄县|