Что самый минимальный путь состоит в том, чтобы достигнуть Внедрения зависимости?

Я читал о Spring и хотя он, как утверждают, менее сложная альтернатива EJB, мне нелегко переносить мою голову вокруг этого. Существует ли более минимальный способ достигнуть Внедрения зависимости, чем принятие подхода Spring?

9
задан Jk1 6 July 2014 в 09:48
поделиться

9 ответов

Google Guice - очень минималистичная структура DI.

3
ответ дан 4 December 2019 в 12:17
поделиться

Почему бы просто не сделать это без фреймворка?

Спросите, от чего зависит ваш класс, и затем внедрите эти объекты через (скажем) конструктор.

Несколько подсказок:

  1. ваш класс полагается на синглтон? Вместо этого введите этот объект (возможно, как фабрику)
  2. , полагается ли ваш объект на другие конкретные классы? Если это так, введите их, но ссылайтесь на них через интерфейсы, чтобы вы могли заменить их другими реализациями

, например. просто создайте класс с конструктором следующим образом:

public TradeSaver(final ITradeValidator validator, final ITradeDatabase db);

(где оба параметра являются интерфейсами), и затем вы можете ввести основные компоненты, от которых зависит ваш TradeSaver (проверка и сохранение базы данных), с возможностью предоставления разные реализации для тестирования, разные развертывания и т. д.

9
ответ дан 4 December 2019 в 12:17
поделиться

Что касается DI и IoC, он, вероятно, не может быть более минимальным, чем пикоконтейнер .

Я предпочитаю Tapestry , но Google Guice довольно похож и широко используется, так что это может быть лучшим выбором, так как будет легче найти учебные пособия и т. Д.

2
ответ дан 4 December 2019 в 12:17
поделиться

По сути, внедрение зависимостей - это просто способ структурирования вашего кода для повторного использования компонентов. Не требует использования контейнера. Это просто означает, что вы перемещаете любое использование оператора «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, атрибутов классов или привязок, определенных с помощью кода.

1
ответ дан 4 December 2019 в 12:17
поделиться

Другой вариант, о котором еще не упоминалось, - это Ян . Я использовал его в прошлом, он был очень легким и минималистичным. Вот ссылка с одностраничным введением о том, что (и как) он делает:

http://yan.codehaus.org/

2
ответ дан 4 December 2019 в 12:17
поделиться
  1. прочитать файл конфигурации Spring xml bean
  2. записать его на простом языке java.
-3
ответ дан 4 December 2019 в 12:17
поделиться

Я настоятельно рекомендую вам просто попробовать Spring. На начальных этапах он немного сложнее, чем Guice, однако, обертки для других API и включенные утилиты (LDAPTemplate, JDBCTemplate, HibernateTemplate, Validators и т.д.) вполне оправдывают стоимость входного билета.

Однако, если вы твердо решили не пробовать Spring, Guice или Seam предлагают хорошие альтернативы.

2
ответ дан 4 December 2019 в 12:17
поделиться

Я настоятельно рекомендую вам изучить реализацию JSR-330, поскольку мы надеемся, что она станет стандартом в будущем. Он есть в JEE6, но это может быть для вас излишним. Я полагаю , что Caucho CanDI может работать и в автономном режиме.

http://www.caucho.com/projects/candi/

0
ответ дан 4 December 2019 в 12:17
поделиться

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
1
ответ дан 4 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: