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