什么是弧
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获得更多的性能优化和功能,而无需创建插件等其他操作。