#java #spring #spring-boot #dependency-injection
#java #spring #spring-boot #внедрение зависимостей
Вопрос:
Я просто изучаю Spring, исходя из опыта Java. Насколько я понимаю, внедрение зависимостей заключается в том, что вы предоставляете объектам их зависимости, а не объекту, инициализирующему свои собственные зависимости. Например:
/*
MyObj depends on HashMap as a dependency.
*/
public class MyObj {
private HashMap hashmap;
public MyObj() {
this.hashmap = new HashMap();
}
}
Вместо того, чтобы делать это, вы предоставляете HashMap
через конструктор.
/*
MyObj depeneds on HashMap as a dependency.
*/
public class MyObj {
private HashMap hashmap;
public MyObj(HashMap hashmap) {
this.hashmap = hashmap;
}
}
Это то, что я считаю внедрением зависимостей. Но то, как Spring делает это, на мой взгляд, более кодовое
и просто более грязное. В Spring у вас должен быть этот отдельный метод🔛
@Bean
public HashMap hashmap() {
return new HashMap();
}
Затем создайте MyObj
объект с помощью ApplicationContext.getBean(MyObj.class)
. Однако я нахожу много проблем
с этим методом. Прежде всего, в приложении Swing я бы инициализировал компонент ui tree maker:
public class ComponentUI {
public ComponentUI(JFrame frame, JPanel panel, ...) {
this.frame = frame;
this.panel = panel;
...
}
}
В этом конструкторе будет много-много компонентов. Таким образом, я могу создавать ComponentUI
,
выполняя new ComponentUI(...)
и передавая компоненты. Однако с Spring у меня должен быть отдельный
метод для каждого из них. Для создания каждого метода требуется много места и много времени. Но проблема
Я считаю, что еще хуже то, что если в конструкторе есть два JPanel
, то вам нужно создать два
отдельных объекта, которые расширяются JPanel
. Позвольте мне показать вам, что я имею в виду:
public class ComponentUI {
public ComponentUI(..., JPanel panel1, JPanel panel2, ...) {
...
this.panel1 = panel1;
this.panel2 = panel2;
...
}
}
С Spring я не могу этого сделать:
@Bean
public JPanel panel1() {
...
}
@Bean
public JPanel panel2() {
...
}
или же будет два метода, возвращающих один и тот же объект, поэтому Spring не знает, какой из них использовать.
Вместо этого я должен создавать свои собственные объекты, которые являются производными JPanel
, а затем использовать их везде. В моем
В приложении Swing у меня есть целая папка компонентов, которые являются производными от других компонентов.
Итак, учитывая эти неудобства, зачем мне использовать внедрение зависимостей Spring вместо обычного внедрения зависимостей, то есть создания объекта и предоставления объектов.
Комментарии:
1. Все это очень плохие примеры внедрения зависимостей. Во-первых, вы бы не стали использовать внедрение зависимостей только для инициализации a
HashMap
. Возможно, если вы прочтете несколько руководств по Spring и посмотрите примеры, которые они используют, вы получите лучшее представление о том, для чего используется внедрение зависимостей Spring.2. @Andreas Да, я думаю
HashMap
, это довольно плохой пример, просто по какой-то причине это было первое, что пришло мне в голову.
Ответ №1:
Внедрение зависимостей Spring делает больше, чем вы показываете. Когда вы попытаетесь сделать все самостоятельно с реальной проблемой, вы увидите боль, а затем оцените преимущества Spring dependency, и я уверен, что вы начнете использовать Spring в кратчайшие сроки.
Я не говорю, что вы должны использовать spring DI, но это облегчило бы вашу жизнь.