gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:21:55 26 4
gpt4 key购买 nike

假设我有一个类,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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com