Какой самый минимальный способ добиться внедрения зависимости? - PullRequest
8 голосов
/ 27 марта 2010

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

Ответы [ 9 ]

9 голосов
/ 27 марта 2010

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

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

Некоторые подсказки:

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

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

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

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

3 голосов
/ 27 марта 2010

Google Guice - это очень минималистичный DI-фреймворк.

2 голосов
/ 27 марта 2010

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

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

2 голосов
/ 27 марта 2010

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

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

2 голосов
/ 27 марта 2010

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

http://yan.codehaus.org/

1 голос
/ 31 марта 2010

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 голос
/ 27 марта 2010

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

0 голосов
/ 31 марта 2010

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

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

0 голосов
/ 27 марта 2010
  1. прочитать конфигурационный файл bean-компонента xml
  2. напиши это простым Java.
...