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

pf4j spring 集成幾個問題記錄

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

以下整理幾個實際使用碰到的問題

問題

  • 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 ,在插件項目中對于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'

與上邊一個問題一樣,不然會有莫名的問題

  • bean 注入問題

官方提供了SpringPluin 抽象 ,此類可以解決spring context 的創(chuàng)建以及一些依賴處理,一般的玩法是自己創(chuàng)建一個,同時對于需要
注意的beans在此對象中注冊
參考
PluginBConfig 為一個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 共享問題
    場景,比如bootstrap 提供datasource,插件直接使用此datasource
    默認(rèn)pf4j spring 只能使用自己插件里邊包含的bean,對于添加了Extension 注解的擴(kuò)展類,可以暴露為一個直接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 中注冊,對于插件同時也包含一個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;
    }
}

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

參考資料

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

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

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

相關(guān)文章

  • Java?Runtime的使用詳解

    Java?Runtime的使用詳解

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

    Spring web集成rabbitmq代碼實例

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

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

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

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

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

    java中幾種常用的HTTP請求工具類舉例詳解

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

    消息隊列MQ使用詳解

    消息隊列(MQ)是一種基于“先進(jìn)先出”原則的數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于分布式系統(tǒng)中,主要用于應(yīng)用解耦、異步消息處理和流量削峰,消息隊列中間件通過允許生產(chǎn)者發(fā)送消息到隊列,消費者從隊列中拉取消息或訂閱消息,實現(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)對 MyBatis-Plus 有了更深入的了解,并能夠在實際項目中靈活應(yīng)用這些功能,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • Java中和隊列相關(guān)的基本操作

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

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

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

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

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

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

最新評論

镇远县| 永昌县| 武城县| 吕梁市| 华亭县| 康定县| 红桥区| 巴马| 凤山市| 怀远县| 河南省| 遂川县| 锡林浩特市| 长汀县| 威海市| 岱山县| 安义县| 治多县| 启东市| 永登县| 诸城市| 新安县| 石家庄市| 张掖市| 通河县| 连城县| 乡宁县| 枣强县| 高台县| 德昌县| 柳州市| 邻水| 马山县| 灵璧县| 嵊泗县| 禹城市| 济南市| 文安县| 朔州市| 高安市| 都匀市|