当前位置: 首页 > 知识库问答 >
问题:

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

方坚壁
2023-03-14

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

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

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

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

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

共有2个答案

羊光辉
2023-03-14

最好的办法可能是走延伸路线。

然而,另一个更简单的方法是将生产者放在应用程序范围的bean中。这个bean可以包含某种缓存(具有弱值的映射可以完成这项工作)。这样,如果给定类型已经存在缓存版本,则可以返回缓存版本,否则在从生产者返回之前创建新对象和缓存。可以从主题注释中提取该键。如果这是一个限定符,则可以将topic属性标记为non-binding。

许嘉福
2023-03-14

另一种方法是编写一个可移植的扩展,对相关注入点进行扫描和分类,然后在观察Beandiscovery事件后的观察者方法中,以编程方式为每个相关注入点类别在应用程序范围内添加Bean。这样,就不需要在producer方法中当前必须进行的动态注入点选择。

 类似资料:
  • 我正在迁移一个活动的Spring Web应用到Spring Boot(1.4.2)。 这些bean是在XML中定义的,因为它正在加载@重要资源。 我正在启动的4个bean是同一个对象BasicDataSource的实例。 为了告诉Spring要加载哪个,我为每个都设置了一个ID,并使用@Qualifer将正确的bean绑定到变量。 但Spring似乎忽略了我的@Qualifier,并抛出“没有可用

  • 我刚刚发现了一种我无法理解的Spring的行为。我使用的是Spring Boot 1.5。十、 在一个配置类中,我声明了两个不同的bean。 然后,我有一个类,它应该使用名为的bean。 因为我指定了我想要使用注释注入的bean的名称,所以我希望Spring注入名为的bean。但是,在注入过程中实际上使用了名为的bean。 事实证明,问题在于在配置类中声明bean的方法的名称。两者都是colled

  • 在上一小节中的表格中,我们知道 . 可以匹配除换行符以外的任意字符,使用.匹配下列文本: expression 但是.每次只匹配一个字符,如果想一次匹配多个,则要使用限定符 限定符 作用 * 匹配零次或多次 + 匹配一次或多次 ? 匹配零次或一次 {3} 匹配三次 {3,5} 匹配三到五次 {3,} 匹配三次或以上 下面通过实例了解限定符的区别。 es 的匹配结果 expression e

  • 如何使用注释在Spring中提供bean继承?在XML配置中,我使用了

  • 问题内容: 该问题的答案表明,当方法采用通配符通用类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特) 这是什么意思?“ 当方法采用通配符通用类型时,可以访问或修改集合,但不能同时访问两者 ”? 据我所知,方法do1具有d2只能访问但不能修改。d2的方法使c2可以被访问和修改,并且没有编译错误。 通用准则 问题答案: 该问题的答案表明,当方法采用通配符通用类型时,可以访问或修改集合