У меня есть бобы, для которых в конкретных инъекциях я хочу добавить данный перехватчик.
Я наивно думал, что есть что-то вроде аннотации @Interceptors
, которая могла бы позволить мне написать
private @Interceptors(Logging.class, Connection.class) @Inject MyBean instance;
К сожалению, документация по сварке четко утверждает обратное.
Итак, как я могу ввести перехваченную версию моего bean-компонента? Возможно ли использование объекта экземпляра cdi?
ИЗМЕНИТЬ
Хотя ответ 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;
То, что я пробовал до сих пор, было
- обнаружение полей, требующих этих инъекций, с использованием библиотеки отражений (которая работает)
- создать с помощью шовной пайки
AnnotatedType
из класса bean-компонента (во время события BeforeBeanDiscovery) (тип создается, но не совсем отличим от исходного) и присвоить этомуAnnotatedType
аннотацию привязки перехватчика. - создать с помощью шовной пайки (снова) объект Bean из сгенерированного
AnnotatedType
и присвоить ему необходимую аннотацию квалификатора
Кажется, все работает, за исключением того, что вводится оригинальный bean-компонент.
Я, конечно, мог бы заменить исходный на перехваченный, но в некоторых случаях такой перехват не требуется, поэтому я должен, чтобы оба AnnotatedType
относились к одному и тому же конкретному типу. Я думал, что смогу сделать это в CDI, но, похоже, это не работает (поскольку исходный тип никогда не заменяется перехваченным).