【发布时间】:2012-02-09 12:27:48
【问题描述】:
我有一些 bean,在特定的注入中,我想为其添加一个给定的拦截器。
我天真地认为有类似 @Interceptors 注释的东西可以让我写作
private @Interceptors(Logging.class, Connection.class) @Inject MyBean instance;
不幸的是,Weld documentation 明确表示相反。
那么,我如何注入截获的 bean 版本?是否可以使用 cdi Instance 对象?
编辑
虽然 LightGuard 的回答确实相关,但它并不能完全回答我的问题,所以让我重新表述一下。
我想要一个触发某种方法调用事件发送的注释。为此,我创建了一个 CDI Interceptor,并带有自己的拦截器绑定(假设拦截器称为 SenderInterceptor,绑定称为 SenderBinding)。我现在想要的是添加一个 CDI 限定符(我们称之为 SenderQualifier),当用于注入时,它会安装 SenderInterceptor。
为了更清楚,我希望下面的代码使用SenderInterceptor
/* calling any method of that bean should trigger an event */
private @Inject @SenderQualifier MyBean aBean;
虽然这个没有
private @Inject MyBean aBean;
到目前为止我尝试的是
- 使用反射库(有效)检测需要这些注入的字段
- 使用焊缝从 bean 类创建
AnnotatedType(在 BeforeBeanDiscovery 事件期间)(类型已创建,但与初始类型没有真正的区别)并为AnnotatedType提供拦截器绑定注释。 - 使用焊缝(再次)从生成的
AnnotatedType创建一个 Bean,并为其提供所需的限定符注释
似乎一切正常,除了注入的是原始 bean。
我当然可以用拦截的替换原始的,但是在某些情况下不需要这样的拦截,所以我必须保持 AnnotatedType 引用相同的具体类型。我在想我可以在 CDI 中这样做,但它似乎不起作用(因为原始类型永远不会被截获的类型取代)。
【问题讨论】:
标签: java cdi interceptor jboss-weld