更多springfox 源码系列文章可关注我的博客,点击前往
时间:2019-5-22 12:46:50
地点:单位、家中
前言
同MapStuct
组件一样,因为springfox中运用到了Spring Plugin插件系统,我们对研究springfox源码之前,先来学习一下Spring Plugin插件的机制
因为在工作中很少使用到Spring Plugin
,所以学习记录下
Spring Plugin
Github:https://github.com/spring-projects/spring-plugin
可以说作为Spring项目中的Spring Plugin
,确实相对小众,并没有像Spring其他的项目那么流行,甚至在其他流行的框架中,都很少见到他的身影.
截止目前(2019-5-22 13:54:08),Github 的Star为222,fork数66
Spring Plugin是世界上最小规模的插件系统
如今构建可扩展的体系结构是创建可维护应用程序的核心原则。 这就是像OSGi这样的完全成熟的插件环境如今如此受欢迎的原因。 不幸的是,OSGi的引入给项目带来了很多复杂性。
Spring Plugin
通过提供扩展核心系统功能的插件实现的核心灵活性,但不提供动态类加载或运行时安装和插件部署等核心OSGi功能,同时为插件开发提供了更实用的方法。 虽然Spring Plugin并不像OSGi那样强大,但它可以满足穷人构建模块化可扩展应用程序的要求。
假如你希望构建一个可扩展的应用系统,你可能需要从以下几点进行考虑:
- 无论出于何种原因,您都无法将OSGi用作完全成熟的插件架构
- 提供专用的插件接口来满足可扩展性
- 通过简单地提供捆绑在JAR文件中并在类路径中可用的插件接口的实现来扩展核心系统
- 使用Spring来构建应用系统
示例
我们通过一个小示例,来对Spring Plugin系统有一个初步的了解
Spring Plugin提供一个标准的Plugin<S>
接口供开发人员继承使用声明自己的插件机制,然后通过@EnablePluginRegistries
注解依赖注入到Spring的容器中,Spring容器会为我们自动匹配到插件的所有实现子对象,最终我们在代码中使用时,通过依赖注入注解,注入PluginRegistry<T extends Plugin<S>, S>
对象拿到插件实例进行操作。
Plugin<S>
接口声明了一个接口实现,标注实现该插件是否支持,因为有可能存在多个接口实现的情况
我们在使用时,可能这样调用:
List<Plugin<S>> plugins=plugin.getPlugins();
S delimiter;
for(Plugin<S> p:plugins){
if(p.supports(delimiter)){
p.doSomeThing();//
}
}
从应用程序的扩展性来说,开发灵活的插件系统是我们每个开发人员都需考虑的
假设目前我们有一个移动电话充值系统,在业务初期发展中,业务的目标是保证稳定性,拥有充值业务
在maven配置中先来引入相关的jar包
<properties>
<logback.version>1.2.3</logback.version>
<org.slf4j.version>1.7.21</org.slf4j.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.plugin/spring-plugin-core -->
<dependency>
<groupId>org.springframework.plugin</groupId>
<artifactId>spring-plugin-core</artifactId>
<version>1.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms