为什么选择自定义扩展?因为我们可以!
说实话,现成的解决方案并不总是能满足需求。有时候,你需要亲自动手,打造一个量身定制的解决方案。这就是自定义 Quarkus 扩展的用武之地。它们就像是让你的应用程序独具一格的秘密武器。
“能力越大,责任越大” – 本叔(以及每一个 Quarkus 开发者)
我们的扩展魔法配方
在我们深入之前,先准备好工具:
- 一点创造力(别担心,我们有很多)
- Quarkus(显然)
- Jakarta EE(我们的可靠助手)
- 一点耐心(相信我,你会需要的)
步骤 1:构思你的扩展
首先,你希望你的扩展做什么?在本教程中,我们将创建一个有趣且实用的东西:一个“随机名言生成器”扩展。因为谁不需要在代码中来点智慧(或搞笑)呢?
步骤 2:设置项目
是时候动手了。打开终端,让我们创建一个新的 Quarkus 扩展项目:
mvn io.quarkus:quarkus-maven-plugin:create-extension -DextensionId=io.mycompany:quarkus-random-quote-generator
这个命令为我们的扩展创建了一个基本结构。就像房子的地基——虽然不太令人兴奋,但却是必不可少的。
步骤 3:实现核心功能
现在,让我们为骨架添加一些肉。我们将创建一个 RandomQuoteGenerator
类来完成主要工作:
package io.mycompany.quarkus.random.quote.generator;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.List;
import java.util.Random;
@ApplicationScoped
public class RandomQuoteGenerator {
private static final List<String> QUOTES = List.of(
"我不是一个伟大的程序员;我只是一个有着良好习惯的好程序员。" - Kent Beck,
"说话容易。给我看代码。" - Linus Torvalds,
"编程不是关于你知道什么;而是关于你能弄明白什么。" - Chris Pine
);
private final Random random = new Random();
public String getRandomQuote() {
return QUOTES.get(random.nextInt(QUOTES.size()));
}
}
看看这个漂亮的 Jakarta CDI 注解(@ApplicationScoped
)。就像我们给了我们的类超能力!
步骤 4:创建运行时模块
接下来,我们需要设置运行时模块。这是当有人实际使用我们的扩展时,魔法发生的地方:
package io.mycompany.quarkus.random.quote.generator.runtime;
import io.mycompany.quarkus.random.quote.generator.RandomQuoteGenerator;
import io.quarkus.arc.runtime.BeanContainer;
import io.quarkus.runtime.annotations.Recorder;
@Recorder
public class RandomQuoteGeneratorRecorder {
public void initialize(BeanContainer container) {
container.instance(RandomQuoteGenerator.class).getRandomQuote();
}
}
这个记录器类就像剧院的后台工作人员——它在幕后设置一切。
步骤 5:部署模块 - 各部分的结合
现在,让我们创建部署模块。这是我们告诉 Quarkus 如何集成我们的扩展的地方:
package io.mycompany.quarkus.random.quote.generator.deployment;
import io.mycompany.quarkus.random.quote.generator.RandomQuoteGenerator;
import io.mycompany.quarkus.random.quote.generator.runtime.RandomQuoteGeneratorRecorder;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.FeatureBuildItem;
class RandomQuoteGeneratorProcessor {
private static final String FEATURE = "random-quote-generator";
@BuildStep
FeatureBuildItem feature() {
return new FeatureBuildItem(FEATURE);
}
@BuildStep
AdditionalBeanBuildItem registerBean() {
return AdditionalBeanBuildItem.unremovableOf(RandomQuoteGenerator.class);
}
@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
void initialize(RandomQuoteGeneratorRecorder recorder) {
recorder.initialize();
}
}
这个处理器就像乐团的指挥,确保我们扩展的所有部分和谐地一起演奏。
步骤 6:配置
每个好的扩展都需要一些配置选项。让我们添加一种自定义名言的方法:
package io.mycompany.quarkus.random.quote.generator.runtime;
import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
@ConfigRoot(name = "random-quote", phase = ConfigPhase.RUN_TIME)
public class RandomQuoteConfig {
/**
* 添加到生成器的自定义名言
*/
@ConfigItem(name = "custom-quotes")
public Optional<List<String>> customQuotes;
}
现在用户可以添加他们自己的名言。就像给他们一支画笔,让他们为我们的杰作添加自己的色彩!
步骤 7:测试 - 因为我们是专业的
没有测试的扩展是不完整的。让我们编写一个简单的测试来确保我们的生成器正常工作:
package io.mycompany.quarkus.random.quote.generator;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import jakarta.inject.Inject;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@QuarkusTest
public class RandomQuoteGeneratorTest {
@Inject
RandomQuoteGenerator generator;
@Test
public void testRandomQuoteGeneration() {
String quote = generator.getRandomQuote();
assertNotNull(quote);
System.out.println("生成的名言: " + quote);
}
}
运行测试就像给你的代码做健康检查。小心驶得万年船!
步骤 8:文档 - 因为我们很友好
最后但同样重要的是,让我们编写一些文档。在项目根目录下创建一个 README.md 文件:
# Quarkus 随机名言生成器扩展
此扩展为您的 Quarkus 应用程序添加了一个随机名言生成器。
## 使用方法
1. 将扩展添加到您的项目中:
```xml
<dependency>
<groupId>io.mycompany</groupId>
<artifactId>quarkus-random-quote-generator</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
```
2. 在代码中注入并使用生成器:
```java
@Inject
RandomQuoteGenerator generator;
public void printRandomQuote() {
System.out.println(generator.getRandomQuote());
}
```
3. 在 application.properties 中自定义名言:
```properties
quarkus.random-quote.custom-quotes=愿源码与你同在,我编程,故我在
```
好的文档就像注释良好的代码——让每个人的生活更轻松。
大结局:发布你的扩展
你做到了!你的扩展已经准备好面对世界。要发布它:
- 将代码推送到 GitHub
- 设置 CI/CD(GitHub Actions 是你的朋友)
- 发布到 Maven Central(因为分享就是关怀)
总结
这就是你的 Quarkus 扩展,从想法到生产就绪的解决方案。就像你刚刚为 Quarkus 的魔法书添加了一个新咒语。记住,能力越大,责任越大……你知道剩下的。
现在去尽情扩展 Quarkus 吧。谁知道呢?你的扩展可能就是 Quarkus 生态系统中的下一个大事件。编码愉快,愿你的构建总是成功!
“最好的代码就是没有代码。” - Jeff Atwood(但我们会为出色的 Quarkus 扩展破例)