Разница между ioc и внедрением зависимостей. объясните внедрение зависимостей весной. В чем разница между инъекцией зависимости b/w JSF и инъекцией зависимости spring..
Разница между ioc и внедрением зависимостей
Ответы (5)
IoC означает инверсию управления.
Давайте посмотрим на некий «сильно связанный код» («MyComponent» зависит от «Logger»):
public class MyComponent
{
public MyComponent()
{
:
}
public void DoSomeWork()
{
var logger = new Logger();
:
}
}
Мы можем изменить его, чтобы использовать «интерфейс», но кто-то должен предоставить «реализацию»:
public class MyComponent
{
public MyComponent()
{
:
}
public void DoSomeWork()
{
ILogger logger = ...; // who’s going to provide this?
:
}
}
Внедрение зависимостей (DI) — это конкретная реализация IoC.
//Dependency Injection pattern
public class MyComponent
{
private ILogger _logger;
public MyComponent(ILogger logger)
{
_logger = logger;
}
public void DoSomeWork()
{
// Use the logger component here
_logger.Log();
:
}
}
Другой реализацией является Service Locator.
//Service Locator pattern
public class MyComponent
{
public MyComponent()
{
:
}
public void DoSomeWork()
{
ILogger logger = ServiceLocator.GetService();
:
}
}
Мартин Фаулер утверждает: «При использовании локатора службы класс приложения явно запрашивает его, отправляя сообщение локатору. При внедрении нет явного запроса, сервис появляется в классе приложения — отсюда и инверсия управления».
Также: «Выбор между Service Locator и Dependency Injection менее важен, чем принцип отделения конфигурации сервиса от использования сервисов внутри приложения. “
Вы можете проверить этот пост: Инверсия зависимостей: локатор службы или зависимость Инъекция
Также:
ASP.NET MVC: разрешить или внедрить? Вот в чем проблема… Дино Эспозито
Инверсия контейнеров управления и шаблон внедрения зависимостей, Мартин Фаулер
InversionOfControl Мартина Фаулера
Термины «внедрение зависимостей» (DI) и «инверсия управления» (IoC) обычно используются взаимозаменяемо для описания одного и того же шаблона проектирования (хотя не все согласны с этим, и некоторые люди склонны применять их немного по-разному). Первоначально шаблон назывался IoC, но Мартин Фаулер предложил перейти на DI, потому что все фреймворки каким-то образом инвертируют управление, и он хотел уточнить, какой аспект управления инвертируется.
Эта статья о внедрении зависимостей содержит обзор и ссылается на статью Фаулера. Он также менее специфичен для конкретных технологий, таких как Spring и PicoContainer, и содержит ссылки на некоторые другие интересные статьи по этой теме. Согласитесь с приведенным выше плакатом, статья Фаулера является каноническим чтением по этому вопросу и также дает отличный обзор.
IoC — это шаблон проектирования, и большинство контейнеров IoC используют внедрение зависимостей. Существуют разные типы внедрения зависимостей, но лучше всего прочитать несколько из этих статей, которые мне помогли;
Лучшая статья, которую вы найдете на эту тему, написана Мартином Фаулером по адресу http://martinfowler.com/articles/injection. HTMLа> . Что касается JSF, эта статья http://java.dzone.com/articles/jsf-anti-patterns-and-pitfalls, по-видимому, указывает на то, что разница заключается в том, что JSF использует внедрение сеттера, а не внедрение конструктора (которое обычно предпочтительнее).