解锁新技能《Spring Plugin插件系统》

news/2024/11/16 19:37:01/

平时工作过程中很少使用Spring Plugin插件,最近因为在学习springfox源码的过程中发现有大量用到,先来学习下插件的使用方法。

GitHub地址:https://github.com/spring-projects/spring-plugin

截止20230426日,GitHub的Star为403,fork数为107.

官方说Spring Plugin是世界上最小规模的插件系统,果然名不虚产,用户数够小。

Spring Plugin通过提供扩展核心系统功能的插件实现核心的灵活性,可以满足我们对模块化可扩展程序的需要。

示例程序

Spring Plugin提供了一个标准的Plugin<S>接口供开发人员声明自己的插件的机制,然后通过@EnablePluginRegistries注解注入到Spring
IOC容器,Spring容器会为我们自动匹配到插件的所有实现子对象,最终我们的代码在使用时通过注入PluginRegistry<T extends
Plugin<S>,S>对象拿到插件实例进行操作。

Plugin<S>接口声明一个实现,标注该插件是否支持,因为可能会有多个接口的实现:

public interface PeoplePlugin extends Plugin<PeoplePluginType> {String eat();
}

定义一个黄种人插件实现类:

@Service
public class YellowPeoplePluginImpl implements PeoplePlugin {@Overridepublic String eat() {return "馒头、大米";}@Overridepublic boolean supports(PeoplePluginType peopleType) {return PeoplePluginType.YELLOW.equals(peopleType);}
}

定义一个白种人插件实现类:

@Service
public class WhitePeoplePluginImpl implements PeoplePlugin {@Overridepublic String eat() {return "面包";}@Overridepublic boolean supports(PeoplePluginType peopleType) {return PeoplePluginType.WHITE.equals(peopleType);}
}

定义一个控制器类,通过@EnablePluginRegistries注解将PeoplePlugin插件及其实现类注入到IOC容器中:

@EnablePluginRegistries(value = PeoplePlugin.class)
@RestController
@RequestMapping("api/plugin")
public class PluginController {@Autowiredprivate PluginRegistry<PeoplePlugin, PeoplePluginType> pluginRegistry;@GetMapping("eat")public void eat() {List<PeoplePlugin> list = pluginRegistry.getPlugins();for (PeoplePlugin people : list) {String s = people.eat();System.out.println(s);}}
}

GitHub地址:https://github.com/mingyang66/spring-parent


http://www.ppmy.cn/news/60664.html

相关文章

JSP在线教学质量评价系统的设计与实现(源代码+论文)

在线教学质量评价系统可以方便和全面地收集教师教学工作的数据&#xff0c;提供师生网上评教的评分结果&#xff0c;快速集中收集各方面的评教信息&#xff0c;使教务管理部门能够及时了解教学动态和师资情况&#xff0c;为教务老师提供相关决策支持&#xff0c;为职称评聘提供…

2.压力测试+优化(Jmeter)

typora-copy-images-to: assert typora-root-url: assert 概述 1.性能指标 从外部看&#xff0c;性能测试主要关注如下三个指标【量越大越好&#xff0c;时间越少越好】吞吐量:每秒钟系统能够处理的请求数、任务数。响应时间:服务处理一个请求或一个任务的耗时。错误率:一批…

【Python】什么是爬虫,爬虫实例

有s表示加密的访问方式 一、初识爬虫 什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略爬虫可以做什么 你可以…

深度学习笔记之卷积神经网络(一)卷积函数与图像卷积操作

深度学习笔记之卷积神经网络——卷积函数 引言什么是卷积图像卷积操作 引言 从本节开始&#xff0c;将介绍卷积神经网络。本节将介绍卷积函数。 什么是卷积 卷积&#xff0c;是一种通过两个函数 f ( ⋅ ) 和 f(\cdot)和 f(⋅)和 g ( ⋅ ) g(\cdot) g(⋅)生成第三个函数 h ( …

出海的中国企业,为什么有80%都选择了这家云服务商?

对于想要出海的中国企业来说&#xff0c;什么样的云服务才是他们的最佳选择&#xff1f; 中国企业出海驶入快车道 中国企业的出海大潮&#xff0c;多年来一直方兴未艾&#xff0c;并且得到了政府部门的大力支持。这股“走出去”的热潮&#xff0c;一方面对内有利于推动产业升级…

销售数据分析怎么做?这篇文章说清楚了

如何分析销售数据&#xff1f;分析销售数据有哪些指标&#xff1f;销售数据分析有什么作用&#xff1f; 销售数据是不是得通过数据分析软件啊&#xff1f; 本文将为您解答疑惑—— 一、分析销售数据的指标 从两个层面上来讲&#xff0c;一个是对销售情况的整体把控&#xf…

I.MX6Q-SDB开发板移植ubuntu

I.MX6Q-SDB开发板移植ubuntu 0.前言一、准备工作二、ubuntu移植1.下载ubuntu发布的根文件系统2.根文件系统的简单修改3.板卡适配设置4.打包根文件系统 三、烧写镜像1.dd命令2.uuu工具3.mfgtool工具4.i.mx6q-sdb的拨码设置&#xff1a; 四、大无语事件 0.前言 这两天收拾杂货堆&…

【Python入门知识】NumPy 数组搜索,案例+理论讲解

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 搜索数组 可以在数组中搜索&#xff08;检索&#xff09;某个值&#xff0c;然后返回获得匹配的索引。 要搜索数组&#xff0c;请使用 where() 方法。 实例 查找值为 4 的索引&#xff1a; import numpy as nparr np.…