gpt4 book ai didi

java - 如何在注入(inject)时指定拦截器

转载 作者:行者123 更新时间:2023-11-30 09:41:52 26 4
gpt4 key购买 nike

我有一些 bean,在特定的注入(inject)中,我想为其添加给定的拦截器。

我天真地以为有一个类似@Interceptors 注释的东西可以让我写

private @Interceptors(Logging.class, Connection.class) @Inject MyBean instance;

不幸的是,Weld documentation显然相反。

那么,我怎样才能注入(inject)我的 bean 的拦截版本呢?是否可以使用 cdi 实例对象?

编辑

尽管 LightGuard 的答案确实很相关,但它并没有完全回答我的问题,所以让我重新表述一下。

我想要一个注释来触发某种方法调用事件发送。为此,我创建了一个 CDI Interceptor,完成了它自己的拦截器绑定(bind)(假设拦截器称为 SenderInterceptor,绑定(bind)称为 SenderBinding ).我现在想要的是添加一个 CDI 限定符(我们称之为 SenderQualifier),当用于注入(inject)时,它会安装 SenderInterceptor

为了更清楚,我希望下面的代码使用SenderInterceptor

/* calling any method of that bean should trigger an event */
private @Inject @SenderQualifier MyBean aBean;

虽然这个没有

private @Inject MyBean aBean;

到目前为止我尝试过的是

  • 使用反射库(有效)检测需要这些注入(inject)的字段
  • 使用缝焊从 bean 类创建一个 AnnotatedType(在 BeforeBeanDiscovery 事件期间)(该类型已创建,但与初始类型没有真正区别)并提供该 AnnotatedType 拦截器绑定(bind)注解。
  • 使用缝焊(再次)从生成的 AnnotatedType 创建一个 Bean,并为其提供所需的限定符注释

一切似乎都有效,除了它是被注入(inject)的原始 bean。

我当然可以用截取的替换原始的,但有些情况下不需要这样的截取,所以我必须保持两个 AnnotatedType 引用相同的具体类型。我在想我可以在 CDI 中做到这一点,但它似乎不起作用(因为原始类型永远不会被拦截的类型所取代)。

最佳答案

你需要做什么:

  1. 将拦截器添加到 beans.xml 以激活它
  2. 创建一个扩展以将拦截器绑定(bind)或拦截器注释添加到 ProcessAnnotatedType 中的类型生命周期事件。您需要调用 getAnnotatedType,添加注释,然后调用 setAnnotatedType。我强烈建议查看 Seam SolderApache DeltaSpike AnnotatedTypeBuilder 项目使这更容易。

关于java - 如何在注入(inject)时指定拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8848247/

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