在Quarkus外部使用弧线
#java #microservices #quarkus #maven

什么是弧

ARC是构建面向时间的CDI 2.0 - Contexts and Dependency Injection specification的实现。由Quarkus团队创建的ARC,用于Quarkus的DI。在此主题中,我们将尝试不在Quarkus应用程序中使用它。

如何使用它

豆定义

因为基于CDI的ARC,对于定义bean,我们将使用标准注释@ApplicationScoped定义Bean和@Inject,以将Bean彼此注入。看起来像这样:


import javax.inject.Inject;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class ServiceImpl implements Service {

    @Inject
    Service2 service2;

    @Override
    public void serve() {

    }

}

豆处理

处理豆的切入点为BeanProcessor。它可以通过构建器创建。然后我们可以使用方法process,该方法将解决beans并为快速应用程序启动生成资源。

执行

Maven插件

我们将在Maven应用中使用ARC。要修改构建过程,我们需要创建插件。我们需要访问应用程序.class文件以及所有编译和运行时依赖项。看起来像这样:

package com.nutrymaco.arc.maven.plugin;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;

@Mojo(name = "build", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME, threadSafe = true)
public class BuildMojo extends AbstractMojo {

    @Parameter(defaultValue = "${project}", readonly = true, required = true)
    private MavenProject project;

    @Override
    public void execute() {
            // build logic
    }

}

豆处理

BeanProcessor需要所有需要我们应用程序的类的索引。因此,我们使用Jandex创建所有类的索引。

Indexer indexer = new Indexer();

// add all .class files to index
indexJar(project.getArtifact().getFile(), indexer);

for (Artifact artifact : project.getArtifacts()) {
    indexJar(artifact.getFile(), indexer);
}

Index index = indexer.complete();

然后我们可以创建BeanProcessor

BeanProcessor.builder()
    .setApplicationIndex(index)
    .setComputingBeanArchiveIndex(index)
    .setImmutableBeanArchiveIndex(index)
    .setGenerateSources(true)
    .setOutput(new JarResourceOutput(generatedJarCreator))
    .setTransformUnproxyableClasses(true)
    .build();

JarResourceOutput由ARC类和service provider文件创建为JAR

switch (resource.getType()) {
    case JAVA_CLASS:
        jar.addFile(
            target.resolve(resource.getName()) + ".class",
            resource.getData());
        break;
    case SERVICE_PROVIDER:
        jar.addFile(
            target.resolve("META-INF")
                  .resolve("services")
                  .resolve(resource.getName()).toString(),
            resource.getData());
        break;
    case JAVA_SOURCE:
        break;
}

运行

在主类中,我们应该初始化容器,然后我们可以要求bean。

public class AppMain {
    public static void main(String[] args) {
        var container = Arc.initialize();
        var service = container.select(Service.class);
        service.serve();
    }
}

概括

结果,我们为应用程序添加了构建时间di。为此,我们创建了Maven插件,在其中使用BeanProcessor来处理BEAN定义。然后,在运行时,我们使用Arc.initialize()初始化容器。您可以这样使用它或使用Quarkus获得更多的性能优化和功能,而无需创建插件等其他操作。