通过非限定符注释为Bean赋值

问题描述 投票:1回答:1

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

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

但是假设此RecordSender类相当繁重但具有线程安全性,因此应尽可能多地共享。这意味着我希望任何看起来像@Inject @Topic("FooBar") RecordSender fooBarSender的注入站点共享以FooBar作为名称构造的RecordSender实例。

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

我的愿景是一个注释,可以选择在范围注释(可能是ScopedTo)的陪同下,其参数是非限定符注释类,该类将强制对其所注释的bean进行范围分离。因此,例如,生产者方法上的@ApplicationScoped @ScopedTo(Topic.class)将是我的问题的答案(每个应用程序每个唯一的Topic注释一个RecordSender)

java cdi
1个回答
0
投票

另一种方法是编写一个可移植的扩展程序,该扩展程序对相关的注入点进行扫描和分类,然后在观察器方法中观察AfterBeanDiscovery事件,为每个相关的注入点类别在programmatically adds beans范围内的ApplicationScoped。这样就不需要在生产者方法中当前必须执行的动态InjectionPoint选择。

© www.soinside.com 2019 - 2024. All rights reserved.