我目前正在开发一个尽可能尊重六边形架构原则的应用程序。
因此,我的“域”模块(groupId:acme
;artifactId:my-domain
)不依赖于任何技术框架。
我的所有服务都带有自定义注释(本身是我的域的一部分):
package acme.domain;
@Target({ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface DomainService {
}
但是,在我的“Quarkus application”模块(groupId:acme
;artifactId:app-quarkus
)中,我需要注入(inject)在“domain”模块中定义的服务(acme:domain
)。
使用SpringBoot,就是quite easy to inject those domain services (based on a custom annotation)带有以下注释:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
@SpringBootApplication
@ComponentScan(
basePackageClasses = {CourtageSpringbootApplication.class, DomainService.class},
includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {DomainService.class})}
)
public class MySpringbootApplication {
}
Quarkus 是否有相当于 @ComponentScan
的功能?
注意:我在 app-quarkus/src/main/resources/application.properties
中添加了以下几行,但它不起作用:
quarkus.index-dependency.courtage.group-id=acme
quarkus.index-dependency.courtage.artifact-id=my-domain
抛出异常:javax.enterprise.inject.UnsatisfiedResolutionException
最佳答案
首先,我个人认为严格避免在域模块中使用 CDI 注释有点过于热心。但如果你真的想要这样,我可以看到两个选择:
您可以限制自己只在自己的注释上放置 CDI 注释,并使用
@Stereotype
。例如,如果您的@DomainService
应等效于@ApplicationScoped
,则可以这样声明:@Stereotype @ApplicationScoped @Target({ElementType.TYPE}) @Retention(value = RetentionPolicy.RUNTIME) public @interface DomainService { }
如果您绝对坚持域模块中不应出现任何 CDI 注释,您可以创建一个 Quarkus 扩展,将
@DomainService
注册为自定义 bean 定义注释。 Quarkus CDI 集成指南对此有更多详细信息:https://quarkus.io/guides/cdi-integration您可以使用 AutoAddScopeBuildItem 或 BeanDefiningAnnotationBuildItem。
关于java - 带有自定义注释的 Quarkus CDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71572027/