java - 通过非限定符注释确定 Bean 的范围

标签 java cdi

假设我有一个类,RecordSender,其构造函数采用目标名称。为了 CDI 化这个类,我可能会编写一个像这样的生成器,它检查注入(inject)点以查找名为 Topic 的注释(不是限定符,因为生成器方法不能用它可能生成的主题名称的所有可能值进行注释):

@Produces
public RecordSender getRecordSender(InjectionPoint injectionPoint) {
    return new RecordSender(injectionPoint.getAnnotated().getAnnotation(Topic.class).value());
}

但是假设这个 RecordSender 类相当重,但是线程安全,因此应该尽可能地共享。这意味着我希望任何类似于 @Inject @Topic("FooBar") RecordSender fooBarSender 的注入(inject)站点共享以 FooBar 作为名称构造的 RecordSender 实例。

我们不能将生产者方法标记为 ApplicationScoped,因为 RecordSender 只能在具有相同名称的注入(inject)点之间共享。我们不能将 @Topic 设置为限定符,因为生产者方法不会使用此限定符进行注释。 CDI 解决这个问题的方法是什么?

我的愿景是一个可选地伴随范围注释的注释,可能是 ScopedTo,其参数是一个非限定符注释类,它将强制分离它们注释的 bean 的范围。例如,生产者方法上的 @ApplicationScoped @ScopedTo(Topic.class) 将是我的问题的答案(每个应用程序每个唯一的主题注释一个 RecordSender)

最佳答案

另一种方法是编写一个可移植扩展来扫描相关注入(inject)点并对其进行分类,然后在观察 AfterBeanDiscovery 事件的观察者方法中,programmatically adds beans在每个相关注入(inject)点类别的 ApplicationScoped 范围内。那么就不需要您当前在生产者方法中执行的动态 InjectionPoint 选择。

关于java - 通过非限定符注释确定 Bean 的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58226819/

相关文章:

java - 运行应用程序时,字符串无法转换为 JSONObject 错误

jakarta-ee - CDI:跨不同模块/bean文件使用拦截器

java - 如何从 Quarkus Arc bean 解析中排除第 3 方 CDI bean 工厂?

jsf - 当名为 cid 的查询字符串参数附加到 URL 时,摆脱 org.jboss.weld.context.NonexistentConversationException

unit-testing - 需要 CDI 容器的单元测试会导致 java.lang.IllegalStateException : Unable to access CDI

java - CDI:基于对象类的注入(inject)

java - Mockito - 无需注入(inject)的模拟依赖

java - Java序列化-实现细节泄漏

java - 无法解析 : com. android.support:appcompat-v7:jar

Java - 最后创建的对象覆盖前一个对象