Весна ДИ? Тип интерфейса? - PullRequest
0 голосов
/ 28 февраля 2012

Я понимаю, как, но не могу формально сформировать определения.

Как известно, DI может быть выполнен через конструктор, сеттер или интерфейс. Меня смущает последний DI, основанный на одном интерфейсе, он используется в Spring?

ОБНОВЛЕНИЕ: я дал здесь плохой анализ, что привело к неправильному пониманию.

Чтобы исправить это:

Скажем, у нас есть сеттер, и в сеттер мы внедряем интерфейс, реализованный некоторым классом. Это считается DI через сеттер или интерфейс?

http://martinfowler.com/articles/injection.html#UsingAServiceLocator эта статья делит DI на:

"Существует три основных стиля внедрения зависимостей. Я использую для них имена: Внедрение в конструктор, Внедрение в сеттер и Внедрение в интерфейс. Если вы читаете об этом в текущих дискуссиях об инверсии управления, вы услышите они называются IoC типа 1 (внедрение интерфейса), IoC типа 2 (внедрение сеттера) и IoC типа 3 (внедрение конструктора). Я нахожу числовые имена довольно трудно запомнить, поэтому я использовал имена, которые у меня здесь есть. «

Другой шаблон локатора службы, используемый для IoC, действительно ли он делает возможным @Autowired? - то есть, что не все классы должны быть явно объявлены в xml для DI, поскольку мы можем объявить их как @Repository или @Controller или снова, если я правильно помню.

Спасибо

1 Ответ

3 голосов
/ 28 февраля 2012

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

@Autowired
UserService us; // wire a bean implementing UserService

-

@Service
public class UserServiceImpl implements UserService {
    // the @Service annotation causes this implementation of UserService to 
    // be made available for wiring in the bean factory.
}

Стоит отметить, что если вы проводите по интерфейсу, Spring ожидает, что он будет существовать иточно один компонент на фабрике компонентов, реализующий этот интерфейс.Если найдено более одного компонента, выдается сообщение об ошибке, и вам необходимо указать, какой компонент следует подключить (используя аннотацию @Qualifier).

РЕДАКТИРОВАТЬ:

При подключении выможет связывать переменную-член или метод установки.

@Autowired
UserService us;

-

@Autowired
public void setUserService(UserService us) {
    this.us = us;
}

Эти два результата дают одинаковый результат.Разница в том, что в первом случае Spring будет использовать отражение, чтобы установить переменную us для компонента, реализующего UserService.В последнем Spring будет вызывать метод setUserService, передавая ту же реализацию UserService.

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