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, статей, но никто не говорит про суть, как-будто програмисты превратились в роботов, следуют инструкциям без осмысливания.
Спасибо кто ответит.
Dependency Injection на примере Java
-
- Уже с Приветом
- Posts: 166
- Joined: 13 Oct 2003 20:11
- Location: Canada
-
- Уже с Приветом
- Posts: 19041
- Joined: 11 Jan 2012 09:25
- Location: CA
Re: Dependency Injection на примере Java
А почему вы считаете что Car не зависит от Engine ? Откуда такой вывод ?
Насколько я виду зависит. Просто зависимость не через наследие класса или интерфейс, а через composition. Car has an Engine. Самый тот случай для dependency injection.
Насколько я виду зависит. Просто зависимость не через наследие класса или интерфейс, а через composition. Car has an Engine. Самый тот случай для dependency injection.
https://www.youtube.com/watch?v=wOwblaKmyVw
-
- Уже с Приветом
- Posts: 166
- Joined: 13 Oct 2003 20:11
- Location: Canada
Re: Dependency Injection на примере Java
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?
Из-за моего недостаточного или скорее отсутствия понимания концепции 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?
-
- Уже с Приветом
- Posts: 15526
- Joined: 27 Sep 2007 22:53
Re: Dependency Injection на примере Java
На мой взгляд, используемая аннотация нужна только для привязки к фреймворку (видимо спринт).
-
- Уже с Приветом
- Posts: 166
- Joined: 13 Oct 2003 20:11
- Location: Canada
Re: Dependency Injection на примере Java
re: На мой взгляд, используемая аннотация нужна только для привязки к фреймворку (видимо спринт).
Видимо Spring.
Я понял, что Dependency Injection можно сделать в ручную, без framework.
В этом мой вопрос - всё нужное сделано для Dependency Injection в моём коде или нет? Если всё, зачем тогда что-то ещё вставлять для привязки к framework? Framework вставляет annotanion в java код, значит это зачем-то нужно, значит чего-то не хватает, значит я чего-то не знаю/понимаю. Я не могу найти ответ.
Или это всё ненужная ахинея?
Видимо Spring.
Я понял, что Dependency Injection можно сделать в ручную, без framework.
В этом мой вопрос - всё нужное сделано для Dependency Injection в моём коде или нет? Если всё, зачем тогда что-то ещё вставлять для привязки к framework? Framework вставляет annotanion в java код, значит это зачем-то нужно, значит чего-то не хватает, значит я чего-то не знаю/понимаю. Я не могу найти ответ.
Или это всё ненужная ахинея?
-
- Уже с Приветом
- Posts: 19041
- Joined: 11 Jan 2012 09:25
- Location: CA
Re: Dependency Injection на примере Java
Если вам понятна концепция dependency, то dependency injection это всего лишь декларативный способ ее объявления. Значит at runtime при создании Car instance в контейнере будет подбираться Engine instance согласно вашей аннотации. При этом оба могут быть декларированы как beans, могут быть собственно интерфейсами, но это детали. Heads first Design Patterns - отличная книжка для понимания этих вещей.Don Cherry wrote:Из-за моего недостаточного или скорее отсутствия понимания концепции Dependency InjectionА почему вы считаете что Car не зависит от Engine ? Откуда такой вывод ?
Код ваш во-первых тут не приведен весь, а во вторых пользуетесь вы явно Спрингом и проверять аннотации без остального контекста занятие бессмысленное
https://www.youtube.com/watch?v=wOwblaKmyVw
-
- Уже с Приветом
- Posts: 4827
- Joined: 15 May 2001 09:01
Re: Dependency Injection на примере Java
Don Cherry
В main() у Вас явно должно быть прописано, какой марки Engine создаётся. Не new Engine(), а new KiaEngine(). Это может быть плохо. Например
- когда main() - не Ваш, а фреймворковский. Нету, например, у war/ear main(). Чтобы создать экземпляр нужного мотора, приходится искать место, которое получает управление при старте приложения. А оно в разных приложениях разное: и по имени и по поведению.
- когда main и *Engine пишут разные команды. Потому что main надо перекомпилировать с каждым новым релизом KiaEngine.
- когда Вы уходите с проекта. Новые люди вставляют бантиков на три релиза. Вы возвращаетесь - и видите, что main модуль теперь занимает полпроекта. Потому что в нём уже были все зависимости прописаны, и новое добавляли в него - удобно же.
В 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
Раз нынче можно в рабочих разделах постить картинки на злобу дня, вот вам
https://www.youtube.com/watch?v=wOwblaKmyVw