Существует ли простая структура, допускающая внедрение зависимостей в отдельной программе? - PullRequest
6 голосов
/ 26 августа 2009

Нам необходимо уметь корректировать поведение во время запуска, предоставляя нужные классы, которые будут создаваться различными фабриками внутри нашего приложения (чтобы избежать жесткого связывания оператора «new»).

Мне известно, что это обеспечивается несколькими крупными платформами, но я искал что-то, что могло бы легко использоваться автономным приложением Java, не будучи гигантским.

Есть предложения?


Редактировать: По моему опыту, фреймворки имеют тенденцию расти как часть зрелости (и тоже сложные). Мне нужно, чтобы это можно было перенастроить в унаследованное приложение как часть основного рефакторинга (технического долга), поэтому для используемых библиотек важна простота. Я не возражаю против того, чтобы в нашем приложении было немного кодирования, но должно быть очень хорошо видно, что происходит. У АОП есть тенденция убирать вещи с дороги, и это может усложнить поддержку приложения.


Редактировать: Теперь мы достигли точки, когда нам действительно нужно принять решение. Приложение, вероятно, будет жить в течение десятилетий, поэтому нам нужно принять обратимое решение с помощью структуры, которая будет сохраняться, как мы надеемся, так долго. Мне действительно нравится статическая проверка типов, доступная в Guice, но не то, чтобы аннотации явно привязывались к Guice, а не были внешними, как в Spring. Мне также нравится, что этот код выглядит более лаконичным при использовании Guice, а не Spring. Нам нужно что-то надежное и полезное. Нам не нужно больше, чем просто DI на данный момент. Есть ли прецедент, в котором однозначно написано «пойти на один из них?»


Редактировать 2011-07-27: Окончательное решение состояло в том, чтобы использовать API JSR-330 в коде и выбирать для каждого проекта, использовать ли Spring, Guice или Weld. Для автономных приложений Guice хорошо работал до реализации JSR-330.

Ответы [ 10 ]

7 голосов
/ 26 августа 2009

Вы всегда можете использовать Spring Framework 2.5. Это большой, но если вы планируете использовать только DI, вы можете использовать модули Spring-Core и Spring-Beans, которые довольно маленькие (около 500 КБ и 300 КБ).

Существует также Google Guice 2.0, который поставляется с пакетом, содержащим только базовые данные (без AOP), и его объем составляет 430 КБ.

5 голосов
/ 26 августа 2009

Вы смотрели на Google Guice рамки? Он довольно легкий и основан на аннотациях, избегая XML файлов конфигурации

Также есть Пико - и нано-контейнер (от codehaus), которые довольно легковесны, хотя в последний раз, когда я смотрел (по общему признанию несколько лет назад), документация отсутствовала.

Я должен сказать, что я согласен с другими в том, что, как я полагаю, вы предполагаете, что Spring массивный и запутанный. Это действительно очень простой контейнер IoC, и его следует рекомендовать.

2 голосов
/ 26 августа 2009

Есть пара, о которой я знаю, что вам может пригодиться:

Я считаю, что Plexus очень полезен в автономных приложениях, поскольку в нем есть дополнительные служебные компоненты для взаимодействия с CLI.

1 голос
/ 26 августа 2009

Я бы настоятельно рекомендовал взглянуть на Spring ME . Хотя изначально предполагалось, что это будет способ использования Spring в приложениях Java ME, он также отлично работает для автономных приложений.

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

С положительной стороны: он основан на (совместимом) подмножестве файлов конфигурации Spring, а занимаемая площадь времени выполнения составляет 0%. На самом деле их нет. Spring ME возьмет контекст вашего приложения и превратит его в класс, который не зависит от других классов, кроме вашего.

1 голос
/ 26 августа 2009

Большинство ответов до сих пор, похоже, касаются размера файлов jar, которые нужно добавить.

Однако я думаю, что более важный вопрос - это влияние на проект: сколько строк кода необходимо добавить / изменить, чтобы использовать фреймворк?

Даже "большой" пружинный каркас на самом деле очень прост в использовании:

Вам в основном нужно:

  • XML-файл, описывающий ваши фабрики.
  • одна строка кода для инициализации контейнера путем загрузки xml-файла

Приятно, что пружина не навязчива . Таким образом, вам не нужно реализовывать определенные интерфейсы или добавлять какие-либо конкретные аннотации или импорт в ваши классы.

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

1 голос
/ 26 августа 2009

Под "гигантским" я собираюсь предположить, что вы имеете в виду Spring, но это несправедливо, поскольку вы можете чертить кусочки Spring, которые хотите использовать. Если вам нужен только контейнер IoC, просто используйте соответствующие файлы JAR и соответствующий бит API и игнорируйте все остальное.

0 голосов
/ 27 августа 2009

Если вы хотите что-то действительно легкое, вы можете взглянуть на fuse , оно достаточно расширяемое, так что, возможно, вы ищете.

ура

N

0 голосов
/ 26 августа 2009

Примерно год назад я задал себе вопрос, очень похожий на этот. Поэтому я провожу несколько часов, читая документацию Spring и Guice. Примерно через час после Spring я почувствовал, что смогу запустить базовое веб-приложение, но не знал, как его использовать в автономном приложении. После часа работы с документом Guice все щелкнуло, и я смог понять, как мне сделать то, что я хотел сделать. Теперь порекомендовать Guice? Ну нет. Что ваша команда уже знает? Если кто-то уже знает, скажите Spring Liver эти знания и попросите их распространить их. Как мудро с Guice или Pico.

0 голосов
/ 26 августа 2009

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

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

Недостатком является то, что развертывание непредвиденного логического изменения по своей сути занимает дополнительную секунду или около того времени компиляции, и (что более важно) не может быть запущено в производство без полного тестирования, маскируясь под «просто изменение конфигурации» .

0 голосов
/ 26 августа 2009

Что не так с пружиной ?

В наши дни он упакован довольно хорошо, так что вам не нужно брать весь комплект и кабачок.

Кроме того, я не фанат основанных на аннотациях каркасов инъекций. Это связано с тем, что аннотации привязаны к классу, а не к экземпляру, а последнее является обязательным условием, imho, для DI. Это означает, что каждый экземпляр данного класса получает один и тот же объект (ы), что, кажется, побеждает точку.

Также учтите, что DI даже не нужен каркас, что не так с вашим основным методом, соединяющим приложение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...