欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何給Sprintboot應用添加插件機制

 更新時間:2023年08月25日 09:19:51   作者:陳sir的知識庫  
這篇文章主要為大家介紹了如何給 Sprintboot 應用添加插件機制,文中有詳細的解決方案及示例代碼,具有一定的參考價值,需要的朋友可以參考下

場景

想要讓boot應用增加插件能力,擴展restful api。插件可以由第三方開發(fā)

要解決的問題

  • 第三方的api需要和主應用使用相同的pom依賴
  • 第三方的api獨立打包成jar包,并按照命名規(guī)則取名
  • 第三方的api需要再boot應用之外的獨立存儲中放置(部署)
  • 第三方的api jar 包的加載時機及方式

方案

  • 獨立的依賴管理 pom 第三方插件繼承此pom 統(tǒng)一依賴
  • api jar 包放置到特定路徑。由boot 啟動時加載。(也可以熱加載,但實現(xiàn)方式復雜一些)
  • 技術點 classloader 加載插件 jar, 類型需要添加到spring bean 中統(tǒng)一管理生命周期。

下面是classloader的實現(xiàn)

public class ClassLoaderUtil {
    public static ClassLoader getClassLoader(String url) {
        try {
            Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
            if (!method.isAccessible()) {
                method.setAccessible(true);
            }
            URLClassLoader classLoader = new URLClassLoader(new URL[]{}, ClassLoader.getSystemClassLoader());
            method.invoke(classLoader, new URL(url));
            return classLoader;
        } catch (Exception e) {
            log.error("getClassLoader-error", e);
            return null;
        }
    }
}

啟動時將類加入到spring中

public class PluginImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    private final String targetUrl = "file:/D:/SpringBootPluginTest/plugins/plugin-impl-0.0.1-SNAPSHOT.jar";
    private final String pluginClass = "com.plugin.impl.PluginImpl";
    @SneakyThrows
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        ClassLoader classLoader = ClassLoaderUtil.getClassLoader(targetUrl);
        Class<?> clazz = classLoader.loadClass(pluginClass);
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
        BeanDefinition beanDefinition = builder.getBeanDefinition();
        registry.registerBeanDefinition(clazz.getName(), beanDefinition);
    }
}

運行時將類加載到spring中,此時需要用ApplicationContextAware

@Component
public class SpringUtil implements ApplicationContextAware {
    private DefaultListableBeanFactory defaultListableBeanFactory;
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
        this.defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
    }
    public void registerBean(String beanName, Class<?> clazz) {
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
        defaultListableBeanFactory.registerBeanDefinition(beanName, beanDefinitionBuilder.getRawBeanDefinition());
    }
    public Object getBean(String name) {
        return applicationContext.getBean(name);
    }
}

做一個運行時加載的入口

@GetMapping("/reload")
public Object reload() throws ClassNotFoundException {
		ClassLoader classLoader = ClassLoaderUtil.getClassLoader(targetUrl);
		Class<?> clazz = classLoader.loadClass(pluginClass);
		springUtil.registerBean(clazz.getName(), clazz);
		PluginInterface plugin = (PluginInterface)springUtil.getBean(clazz.getName());
		return plugin.sayHello("test reload");

到此這篇關于詳解如何給Sprintboot應用添加插件機制的文章就介紹到這了,更多相關Sprintboot應用添加插件機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring?Boot實現(xiàn)文件上傳的兩種方式總結(jié)

    Spring?Boot實現(xiàn)文件上傳的兩種方式總結(jié)

    應用開發(fā)過程中,文件上傳是一個基礎的擴展功能,它的目的就是讓大家共享我們上傳的文件資源,下面這篇文章主要給大家總結(jié)介紹了關于Spring?Boot實現(xiàn)文件上傳的兩種方式,需要的朋友可以參考下
    2023-05-05
  • java?spring?validation?自動、手動校驗

    java?spring?validation?自動、手動校驗

    HibernateValidator簡化了Java開發(fā)中的參數(shù)校驗過程,提供自動和手動兩種校驗方式,通過引入相關依賴并使用@Validated注解,可以實現(xiàn)自動校驗,手動校驗則需要使用ValidatorUtils類,此方法有效減少代碼重復,提高開發(fā)效率
    2024-09-09
  • java servlet結(jié)合Oracle搭建java的web開發(fā)環(huán)境

    java servlet結(jié)合Oracle搭建java的web開發(fā)環(huán)境

    今天我將與大家分享一下我學JAVA WEB寫的一些小實例 ,我個人是不太喜歡書本上的晦澀的概念的,所以我花了更多的時間在一些應用實例上,我覺得這樣的學習方式很適合我,由簡到繁,由淺入深
    2015-12-12
  • Spring編程式和聲明式事務實例講解小結(jié)

    Spring編程式和聲明式事務實例講解小結(jié)

    這篇文章主要介紹了Spring編程式和聲明式事務實例講解小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • java獲取當前時間戳的方法

    java獲取當前時間戳的方法

    本文主要介紹了java獲取當前時間戳的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java數(shù)據(jù)結(jié)構之位圖的簡單實現(xiàn)和使用

    Java數(shù)據(jù)結(jié)構之位圖的簡單實現(xiàn)和使用

    位圖,?是一種非常常見的結(jié)構,?它使用每個二進制位來存放一個值的狀態(tài),?就類似于?Java?當中?HashSet?存儲元素的功能。本文主要來介紹一下位圖的簡單實現(xiàn)和使用,需要的可以參考一下
    2023-05-05
  • 利用java判斷質(zhì)數(shù)的3種方法代碼示例

    利用java判斷質(zhì)數(shù)的3種方法代碼示例

    這篇文章主要給大家介紹了關于利用java判斷質(zhì)數(shù)的3種方法,在大于1的整數(shù)中,如果只包含1和本身這兩個約數(shù),就被稱為質(zhì)數(shù)(素數(shù)),文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-07-07
  • Java實現(xiàn)簡單的學生教師管理系統(tǒng)

    Java實現(xiàn)簡單的學生教師管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單的學生教師管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java線程池ExecutorService超時處理小結(jié)

    java線程池ExecutorService超時處理小結(jié)

    使用ExecutorService時,設置子線程執(zhí)行超時是一個常見需求,本文就來詳細的介紹一下ExecutorService超時的三種方法,感興趣的可以了解一下
    2024-09-09
  • 圖文詳解Java中class的初始化順序

    圖文詳解Java中class的初始化順序

    網(wǎng)上有很多關于Java中class的初始化順序文章,但是本文通過圖文更加詳細的介紹了Java中class的初始化順序,并對class的裝載順序進行了講解,下面一起來看看。
    2016-08-08

最新評論