Я читал о Spring и хотя он, как утверждают, менее сложная альтернатива EJB, мне нелегко переносить мою голову вокруг этого. Существует ли более минимальный способ достигнуть Внедрения зависимости, чем принятие подхода Spring?
Почему бы просто не сделать это без фреймворка?
Спросите, от чего зависит ваш класс, и затем внедрите эти объекты через (скажем) конструктор.
Несколько подсказок:
, например. просто создайте класс с конструктором следующим образом:
public TradeSaver(final ITradeValidator validator, final ITradeDatabase db);
(где оба параметра являются интерфейсами), и затем вы можете ввести основные компоненты, от которых зависит ваш TradeSaver
(проверка и сохранение базы данных), с возможностью предоставления разные реализации для тестирования, разные развертывания и т. д.
Что касается DI и IoC, он, вероятно, не может быть более минимальным, чем пикоконтейнер .
Я предпочитаю Tapestry , но Google Guice довольно похож и широко используется, так что это может быть лучшим выбором, так как будет легче найти учебные пособия и т. Д.
По сути, внедрение зависимостей - это просто способ структурирования вашего кода для повторного использования компонентов. Не требует использования контейнера. Это просто означает, что вы перемещаете любое использование оператора «new» для ваших компонентов в начало вашего приложения. Например, точка входа в ваше приложение может выглядеть так:
IZooDataRepository repository = new SqlZooDataRepository(somehost, someparam);
IMonkeyManager monkeyManager = new MonkeyManager(repository);
IZebraManager zebraManager = new ZebraManager(repository);
ZooProgram program = new ZooProgram(monkeyManager, zebraManager);
program.run();
Эта фаза известна как «построение графа объектов». Здесь вы подключаете объекты, которые знают своих сотрудников только как интерфейсы к конкретным реализациям этих интерфейсов.
Такое начальное соединение может оказаться довольно длинным и сложным, если у вас есть сотни практических занятий. Поэтому были изобретены контейнеры DI: они каким-то образом заменяют код построения графа объектов, например примерно так:
Container container = new Container(someconfigurationparameters);
ZooProgram program = (ZooProgram) container.Create(ZooProgram.class);
program.run();
Конфигурация графа объектов, созданного контейнером, обычно выполняется с помощью файлов XML, атрибутов классов или привязок, определенных с помощью кода.
Другой вариант, о котором еще не упоминалось, - это Ян . Я использовал его в прошлом, он был очень легким и минималистичным. Вот ссылка с одностраничным введением о том, что (и как) он делает:
Я настоятельно рекомендую вам просто попробовать Spring. На начальных этапах он немного сложнее, чем Guice, однако, обертки для других API и включенные утилиты (LDAPTemplate, JDBCTemplate, HibernateTemplate, Validators и т.д.) вполне оправдывают стоимость входного билета.
Однако, если вы твердо решили не пробовать Spring, Guice или Seam предлагают хорошие альтернативы.
Я настоятельно рекомендую вам изучить реализацию JSR-330, поскольку мы надеемся, что она станет стандартом в будущем. Он есть в JEE6, но это может быть для вас излишним. Я полагаю , что Caucho CanDI может работать и в автономном режиме.
PicoContainer - это самый простой способ начать работу с DI:
предположим, что мы получили
public class A implements IA {
public A(IB dependency){
...
}
}
public class B implements IB {
}
, затем
pico = new DefaultPicoContainer();
pico.addComponent(A.class);
pico.addComponent(B.class);
IA a = pico.getComponent(IA.class); // a is an instance of A with an instance of B passed to the constructor