auto-pipeline
是一个代码生成器,用于自动生成组件的pipeline。帮助你保持项目更小、更简单、更具扩展性。💡
auto-pipeline
是一个用于生成 Pipeline
的注解处理器
,灵感来自于 Google 的 Auto
。❤️
更多信息,请查看 auto-pipeline 文档。
以下是一个简要介绍。详细信息请查看 示例项目 及其测试用例。
auto-pipeline
需要 Java 8 或更高版本。
对于 Maven
项目:
<dependencies>
<!--
auto-pipeline-processor 会为接口生成 Pipeline。
并且scope 是 "provided"的, 因为它只在编译时需要。
-->
<dependency>
<groupId>com.foldright.auto-pipeline</groupId>
<artifactId>auto-pipeline-processor</artifactId>
<version>0.4.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
对于 Gradle
项目:
/*
* Gradle Kotlin DSL
*/
compileOnly("com.foldright.auto-pipeline:auto-pipeline-annotations:0.4.0")
// auto-pipeline 注解处理器将为接口生成管道类
annotationProcessor("com.foldright.auto-pipeline:auto-pipeline-processor:0.4.0")
/*
* Gradle Groovy DSL
*/
compileOnly 'com.foldright.auto-pipeline:auto-pipeline-annotations:0.4.0'
annotationProcessor 'com.foldright.auto-pipeline:auto-pipeline-processor:0.4.0'
auto-pipeline
已发布到 Maven 中央仓库,查看最新版本。
在你的接口上添加 @AutoPipeline
注解,auto-pipeline
将在编译时为该接口生成一些 Java 文件。
以 ConfigSource
为例:
比如名为 ConfigSource
的接口,该接口有 get()
方法,像这样:
public interface ConfigSource {
String get(String key);
}
假设我们希望 ConfigSource#get()
具有一些扩展性,所以我们决定对其应用Pipeline
模式以实现扩展。
现在就让 auto-pipeline
出场,我们只需要在 ConfigSource
上添加 @AutoPipeline
:
@AutoPipeline
public interface ConfigSource {
String get(String key);
}
auto-pipeline-processor
在编译时会自动为 ConfigSource
在 pipeline
package 中生成 Java 文件:
ConfigSourceHandler
我们想要实现的责任接口以实现扩展性ConfigSourcePipeline
责任链ConfigSourceHandlerContext
AbstractConfigSourceHandlerContext
DefaultConfigSourceHandlerContext
我们可以实现 MapConfigSourceHandler
和 SystemConfigSourceHandler
(它们都在 ConfigSource handler 示例 中):
public class MapConfigSourceHandler implements ConfigSourceHandler {
private final Map<String, String> map;
public MapConfigSourceHandler(Map<String, String> map) {
this.map = map;
}
@Override
public String get(String key, ConfigSourceHandlerContext context) {
String value = map.get(key);
if (StringUtils.isNotBlank(value)) {
return value;
}
return context.get(key);
}
}
public class SystemConfigSourceHandler implements ConfigSourceHandler {
public static final SystemConfigSourceHandler INSTANCE = new SystemConfigSourceHandler();
@Override
public String get(String key, ConfigSourceHandlerContext context) {
String value = System.getProperty(key);
if (StringUtils.isNotBlank(value)) {
return value;
}
return context.get(key);
}
}
通过组合 ConfigSourceHandler
创建一个 ConfigSourcePipeline
,可以作为 ConfigSource
的入口:
Map<String, String> mapConfig = new HashMap<String, String>();
mapConfig.put("hello", "world");
ConfigSourceHandler mapConfigSourceHandler = new MapConfigSourceHandler(mapConfig);
ConfigSource pipeline = new ConfigSourcePipeline()
.addLast(mapConfigSourceHandler)
.addLast(SystemConfigSourceHandler.INSTANCE);
现在,我们可以使用 pipeline.get(...)
来调用责任链了!🎉
pipeline.get("hello");
// "world"
pipeline.get("java.specification.version")
// "1.8"
详细信息请查看可运行的单测用例