Dependency Injection на примере Java

Don Cherry
Уже с Приветом
Posts: 166
Joined: 13 Oct 2003 20:11
Location: Canada

Dependency Injection на примере Java

Post by Don Cherry »

What is dependency injection?
Dependency injection means, that your object receives every dependency to other objects via an externalized mechanism.
Say, you have a car, the typical way, it is implemented is:
public class car {
Engine e;

public Car(){ e=new Engine(); }
}
The car object is dependend on an engine. Since the engine is implemented as a member of car, it can not be swapped out for e.g. a test engine.
Now dependency injection comes into play:
public class car {
Engine e;

public Car(Engine e){ this.e=e; }
}
After that, you are able to switch engines.
###

Это просто и понятно, даже мне. Ну я пишу

... some import
public static void main(String[] args)
{
Engine e;
Car c;

e = new Engine();
c = new Car(e);
...
}


Car не зависит от Engine. Но я что-то не допонимаю.
Вопрос: Что в моём коде [голове] не так? Зачем нужна annotation "@Autowired", или XML, с которыми помогают frameworks? Should instance of Engine be created outside of my program? Is that the issue?

public class car {
Engine e;

@Autowired
public Car(Engine e){ this.e=e; }
}

P.S.
On the internet куча примеров, demos, разговоров, tutorials, статей, но никто не говорит про суть, как-будто програмисты превратились в роботов, следуют инструкциям без осмысливания.

Спасибо кто ответит.
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Dependency Injection на примере Java

Post by Сабина »

А почему вы считаете что Car не зависит от Engine ? Откуда такой вывод ?
Насколько я виду зависит. Просто зависимость не через наследие класса или интерфейс, а через composition. Car has an Engine. Самый тот случай для dependency injection.
https://www.youtube.com/watch?v=wOwblaKmyVw
Don Cherry
Уже с Приветом
Posts: 166
Joined: 13 Oct 2003 20:11
Location: Canada

Re: Dependency Injection на примере Java

Post by Don Cherry »

re: А почему вы считаете что Car не зависит от Engine ? Откуда такой вывод ?
Из-за моего недостаточного или скорее отсутствия понимания концепции Dependency Injection.
Я цитирую куски кода из internet
"Now dependency injection comes into play:
public class car {
Engine e;
public Car(Engine e){ this.e=e; }
}
After that, you are able to switch engines."

Например Engine is developed кем-то, у меня Engine jar file, и мой код не нужно перекомпилировать в случае если Engine код перекомпилирован или нужно использовать другой Engine, interface не изменён, все methods теже, я только заменяю jar file.
Я не могу понять/найти суть Dependency Injection, Car is independent from Engine in terms of code compilation. Но что-то не так, что-то нужно делать ещё, зачем надо использовать annotation @Autowired ? Я не могу найти ответ в internet tutorials/articles/blogs/...

"public class car {
Engine e;

@Autowired
public Car(Engine e){ this.e=e; }
}"

Может быть instance of Engine should be created in Engine jar file... как-то, outside of my code?
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15526
Joined: 27 Sep 2007 22:53

Re: Dependency Injection на примере Java

Post by Мальчик-Одуванчик »

На мой взгляд, используемая аннотация нужна только для привязки к фреймворку (видимо спринт).
Don Cherry
Уже с Приветом
Posts: 166
Joined: 13 Oct 2003 20:11
Location: Canada

Re: Dependency Injection на примере Java

Post by Don Cherry »

re: На мой взгляд, используемая аннотация нужна только для привязки к фреймворку (видимо спринт).
Видимо Spring.
Я понял, что Dependency Injection можно сделать в ручную, без framework.
В этом мой вопрос - всё нужное сделано для Dependency Injection в моём коде или нет? Если всё, зачем тогда что-то ещё вставлять для привязки к framework? Framework вставляет annotanion в java код, значит это зачем-то нужно, значит чего-то не хватает, значит я чего-то не знаю/понимаю. Я не могу найти ответ.

Или это всё ненужная ахинея?
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Dependency Injection на примере Java

Post by Сабина »

Don Cherry wrote:
А почему вы считаете что Car не зависит от Engine ? Откуда такой вывод ?
Из-за моего недостаточного или скорее отсутствия понимания концепции Dependency Injection
Если вам понятна концепция dependency, то dependency injection это всего лишь декларативный способ ее объявления. Значит at runtime при создании Car instance в контейнере будет подбираться Engine instance согласно вашей аннотации. При этом оба могут быть декларированы как beans, могут быть собственно интерфейсами, но это детали. Heads first Design Patterns - отличная книжка для понимания этих вещей.

Код ваш во-первых тут не приведен весь, а во вторых пользуетесь вы явно Спрингом и проверять аннотации без остального контекста занятие бессмысленное
https://www.youtube.com/watch?v=wOwblaKmyVw
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: Dependency Injection на примере Java

Post by helg »

Don Cherry

В main() у Вас явно должно быть прописано, какой марки Engine создаётся. Не new Engine(), а new KiaEngine(). Это может быть плохо. Например
- когда main() - не Ваш, а фреймворковский. Нету, например, у war/ear main(). Чтобы создать экземпляр нужного мотора, приходится искать место, которое получает управление при старте приложения. А оно в разных приложениях разное: и по имени и по поведению.
- когда main и *Engine пишут разные команды. Потому что main надо перекомпилировать с каждым новым релизом KiaEngine.
- когда Вы уходите с проекта. Новые люди вставляют бантиков на три релиза. Вы возвращаетесь - и видите, что main модуль теперь занимает полпроекта. Потому что в нём уже были все зависимости прописаны, и новое добавляли в него - удобно же.
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Dependency Injection на примере Java

Post by Сабина »

Раз нынче можно в рабочих разделах постить картинки на злобу дня, вот вам :)
https://www.youtube.com/watch?v=wOwblaKmyVw

Return to “Вопросы и новости IT”