Подтвердить что ты не робот

Есть ли эквивалент в CDI (WELD) для создания определений (как это делается в модулях Guice), а затем создать инжектор?

Мне нравится, как Guice делает достаточно прямо, чтобы вручную создавать свои собственные модули с их собственными привязками, выполненными в коде. С другой стороны, CDI, похоже, больше полагается на магию, а не на программный доступ к привязкам привязок. Я ошибаюсь или как можно добиться такого же эффекта с помощью WELD.

Любой образец кода будет оценен...

РАЗЪЯСНЕНИЕ

Я надеялся построить модуль (термин Guice sorry im unsure of the CDI term) программным путем, используя стиль шаблона компоновщика, заданный Guice на http://code.google.com/p/google-guice/.

Я создаю динамическую систему, и мне нужно, чтобы я мог связывать типы (например, интерфейсы), константы и т.д., а не просто проводить динамический поиск Weld в classpath и т.д., а также искать и регистрировать типы. Я считаю, что CDI является статическим, пакет javax.inject не включает никаких интерфейсов, которые позволяют программно связывать типы с реализациями.

РАЗРЕШЕНИЕ ЧАСТИ 2

Основная предпосылка исходного вопроса заключалась в простом наблюдении за тем, чтобы аннотации выпекались, а правила, определенные в них, чтобы помочь inejctor не могут быть изменены. Первоначально я хотел, чтобы публичный доступ к тем же интерфейсам, что и для сканера класса CDI, для создания определений для его внутреннего использования. В основном, я говорю, что я хочу слой, который позволяет мне читать аннотации и создавать определения для контейнера. Поставщик по умолчанию может быть тем, кто делает то, что происходит сейчас, но если вы хотите какую-то другую стратегию, тогда существует возможность сделать это.

Одной из проблем с нынешним подходом является ограничение, при котором нельзя выбирать компоненты (классы) с разными аннотациями для выбора разных соавторов. Прежде чем прыгать, позвольте мне квалифицировать это утверждение, да, это может быть сделано с провайдерами и такими, но это приводит к большему количеству артефактов. Должен быть более простой способ.

Пример1

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

Представьте, что у вас есть компонент перезаписи url, который для аргументов имеет некоторые параметры, такие как

  • замените этот шаблон на этот шаблон.
  • возможно, html cleaner

Если вы хотите вставить этот же компонент с двумя разными правилами замены, но иметь форсунку для очистки html, застряли. Конечно, есть способы обойти это, но им нужны артефакты, которые, конечно, больше кода.

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

WELD

Этот вопрос был написан whiel ago, я отказался от Weld.I верю, что он диктует, как его магия делается неправильно. Мне не нравится тот факт, что они диктуют мне, как это происходит, не предоставляя мне способ контролировать, когда и как я могу повторить это действие. Мне не нравится эта негибкость.

4b9b3361

Ответ 1

Я регулярно использую Guice и CDI/Seam2. Короткий ответ нет, CDI не поддерживает программное определение bean ( "привязка", как называет его Guice).

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


Мои два цента

Я использую обе фреймворки: Guice для низкоуровневых некоммерческих POJO-компонентов (где мне не нужны/нужны функции CDI), CDI для чего-либо, где мне нужны дополнительные функции CDI, вещи, которые подключены к JSF или EJB3. В основном я начал использовать Guice как способ получить DI в JVM-адаптерах, которые запускают серверный сервер приложений. По мере того, как я больше знаком с CDI, я все же не нуждаюсь в Guice. я imageine, что, когда CDI поддерживает "неуправляемые" экземпляры, я могу заменить Guice на CDI (например, сварка).

RE: Weld 'magic' - IMO ничего не "магия" о сканировании определения bean. Он действительно хорошо определен в спецификации CDI и похож на другие платформы Java Enterprise, такие как JPA и EJB3.

Мой совет для вас:

  • Используйте то, что работает для вас. Если вам не нравится CDI, не используйте его. Например, мне нужны "неуправляемые экземпляры" в моем приложении, поэтому я использую для этого Guice.
  • Если вы считаете, что CDI может быть лучше (я делаю), включитесь - участвовать в сообществе, определяющем CDI.