CDI внедряет конкретные зависимости между банками

Меня немного интересует настройка проекта.

У меня есть проект, который я пытаюсь обновить.

Поэтому я приправил некоторые из своих конкретных классов аннотацией @Named(""). Класс фактически расширяет абстрактный класс, который реализует интерфейс. Я хочу внедрить именованный класс в класс, который не включен в эту банку. Какие соображения я должен иметь в виду при этом?


person SoftwareSavant    schedule 06.09.2016    source источник


Ответы (1)


Ваш вопрос очень расплывчатый, поэтому не ожидайте, что этот ответ ошеломит вас подробностями.

Класс фактически расширяет абстрактный класс, который реализует интерфейс.

Это не должно быть проблемой — конечный экземпляр компонента будет иметь тип всех классов и интерфейсов в иерархии. Не о чем беспокоиться.

Я хочу внедрить именованный класс в класс, который не включен в эту банку.

Во-первых, вы можете только вводить бины в другие бины. Это означает, что ваш другой класс (который не находится в той же банке) должен стать компонентом. Для этого вы включаете CDI в другом архиве и аннотируете класс с желаемой областью действия.

Во-вторых, другой jar должен иметь зависимость от одного с @Named bean-компонентами, чтобы контейнер CDI мог видеть эти bean-компоненты.

И последнее, но не менее важное: убедитесь, что вы используете адекватные области видимости для bean-компонентов. Область действия принадлежит определенному контексту, и каждый из них имеет свой жизненный цикл. Так, например, бины @ApplicationScoped живут с момента запуска приложения до закрытия, а @RequestScoped активны только во время HTTP-запроса.

person Siliarus    schedule 07.09.2016
comment
Спасибо за ваш вклад. Вы правы, это был расплывчатый вопрос. Я новичок в CDI и его возможностях. Когда вы говорите аннотировать класс с желаемой областью действия, я аннотировал его аннотацией Named(). Как область действия работает в контейнере CDI? Вы упоминаете AplicationScope в прямом эфире из (при условии) запуска-завершения jvm, а RequestedScoped живет для HTTP-запроса. Нужно ли мне аннотировать оба компонента? - person SoftwareSavant; 08.09.2016
comment
Возможно, вам следует взглянуть на [weld.cdi-spec.org/documentation/] (документация). Что касается ваших вопросов - @Named не дает компоненту никакой области действия, его цель - сделать его [docs.jboss.org/weld/reference/latest/en-US/html_single/ (доступно из EL). Bean-компонент только с аннотацией @Named по умолчанию будет иметь область действия @Dependent. На следующем примечании - @ApplicationScoped живет от запуска контейнера CDI (момент, когда CDI загружается и начинается волшебство) до его закрытия. И вам не нужно аннотировать bean-компоненты, если @Dependent вам достаточно (думаю, что нет). - person Siliarus; 09.09.2016
comment
Что касается того, как области работают в контейнере CDI - у каждой из них свой жизненный цикл, после которого она перестает существовать, а связанные с ней компоненты будут уничтожены. Например, после запроса @RequestScoped bean-компонентов. Как только появится новый запрос, вы получите новый компонент. Вы также должны догадаться, как работает @SessionScoped. @ConversationScoped и @Dependent могут быть сложнее, и я (опять же) предлагаю для этого документацию Weld. Вы также можете определить свои собственные области. - person Siliarus; 09.09.2016