Зачем использовать внедрение зависимостей Spring вместо обычного внедрения зависимостей?

#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, но это облегчило бы вашу жизнь.