Внедрение зависимостей с помощью @Inject в Weld (JSR-299 RI). Как найти соответствующий @Produces?

Я играл с эталонной реализацией JSR-299 «Weld» с целью использования ее в автономном приложении, я просмотрел документацию и поразился волшебству.

Мой вопрос заключается в том, как находится производитель данного объекта для @Inject'ed?

Либо компилятор java создает подсказки для аннотаций, которые легко найти загрузчиком классов, либо необходимо пройти полный путь к классам, загружая все классы, чтобы увидеть, что они делают, что для меня звучит крайне неэффективно, или это совершенно другой подход.

В чем хитрость?


person Thorbjørn Ravn Andersen    schedule 04.04.2010    source источник


Ответы (3)


Путь к классам сканируется на предмет «архивы bean-компонентов». Архивы бинов — это те библиотеки, которые содержат META-INF/beans.xml. Все bean-компоненты в этих архивах автоматически регистрируются в BeanManager, а их аннотации анализируются и сохраняются. Всякий раз, когда требуется производитель, менеджер фасоли консультируется о подходящих производителях.

person Bozho    schedule 09.04.2010

Я предполагаю, что это работает так же, как и в Seam: в котором classpath действительно сканируется. Impl также будет искать @produce с наименьшей соответствующей областью действия, поэтому вы можете иметь, например, один продукт на уровне сеанса для вошедших в систему пользователей, а другой - на уровне приложения для анонимных пользователей.

person Alexander Torstling    schedule 04.04.2010

Не знаю, но этот @Inject, частично сделанный отцом Hibernate, был окончательно переработан/под влиянием SpringSource и Google. Возможно, это немного похоже на Guice?

person Sebastien Lorber    schedule 05.04.2010
comment
сама аннотация @Inject была указана командой, сформированной участниками Guice и Spring. Это часть другого JSR. - person Bozho; 20.04.2010