2012-02-28 5 views
0

Я понимаю, как, но не могу формально определять определения.Spring DI? Тип интерфейса?

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

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

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

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

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

«Есть три основных стиля инъекции зависимостей имен я использую для них Constructor Injection, сеттер инъекций, и Инъекция интерфейса Если вы читаете об этом в текущих дискуссиях об инверсии управления, вы услышите, что они называются IoC (вставка интерфейса), IOC типа 2 (инъекция установщика) и IOS типа 3 (инъекция конструктора). Я считаю, что числовые имена трудно вспомнить, поэтому я использовал имена, которые у меня есть ».

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

Благодаря,

ответ

3

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

@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).

EDIT:

Когда проводка, вы можете либо провода переменной-члена или метод установки.

@Autowired 
UserService us; 

-

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

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

+0

пожалуйста, сравните с другими методами DI, так как теперь я еще больше смущен. Я получаю значение, но давайте оставим @Autowired на мгновение.(забудьте о контексте: компонент-сканирование - скажем, у нас его нет). Покажите мне, пожалуйста, разницу между DI с помощью сеттера и интерфейса - вы можете установить интерфейс в сеттер - тогда что это будет вызвано через интерфейс или через сеттер? Тогда почему это формально делится на DI через Setter OR Interface. – Aubergine

+0

«разница между DI через сеттер и интерфейс» - яблоки и апельсины, они не имеют ничего общего друг с другом. См. Править выше. – pap

+0

Я точно понимаю, что вы делаете и как это работает (я сам реализовал, и это работает блестяще). И это то, что я думал, что его нельзя сравнивать. Но почему автор статьи помещает инъекцию интерфейса вдоль линии с помощью инъекций установщика и конструктора? – Aubergine

Смежные вопросы