为什么选择自定义扩展?因为我们可以!

说实话,现成的解决方案并不总是能满足需求。有时候,你需要亲自动手,打造一个量身定制的解决方案。这就是自定义 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=愿源码与你同在,我编程,故我在
```

好的文档就像注释良好的代码——让每个人的生活更轻松。

大结局:发布你的扩展

你做到了!你的扩展已经准备好面对世界。要发布它:

  1. 将代码推送到 GitHub
  2. 设置 CI/CD(GitHub Actions 是你的朋友)
  3. 发布到 Maven Central(因为分享就是关怀)

总结

这就是你的 Quarkus 扩展,从想法到生产就绪的解决方案。就像你刚刚为 Quarkus 的魔法书添加了一个新咒语。记住,能力越大,责任越大……你知道剩下的。

现在去尽情扩展 Quarkus 吧。谁知道呢?你的扩展可能就是 Quarkus 生态系统中的下一个大事件。编码愉快,愿你的构建总是成功!

“最好的代码就是没有代码。” - Jeff Atwood(但我们会为出色的 Quarkus 扩展破例)