Когда я только начал свое погружение в мир Java, я обнаружил, что во многих вакансиях на HH помимо Java Core значатся как правило еще 2 строчки:
- Hibernate
- Spring
И я решил узнать, что же такое Spring и с чем его едят. Однако попытки зайти на сайты типа spring.io и его русские зеркала запутали еще больше. Дело в том, что информация на подобных сайтах рассчитана на то, что программист уже знаком с понятиями DI и IoC, являющимися фундаментом Spring, а так как я не знал что это, то все, что было написано в основных мануалах мне было абсолютно не понятно.
Понятно, что на Спринге выросла целая эко-система, дающая программисту огромный функционал работы с различными аспектами программирования — и с БД, и с авторизацией и с WEB-функционалом. Однако начнем с простого. Итак, Spring реализует для программиста функционал IoC. DI же является одной из реализаций IoC так же как Factory method или Service Locator.
Ну а теперь пришло время сделать 3 вещи:
- Рассказать что это, собственно, за понятия;
- Объяснить, зачем это нужно и какие преимущества это дает программисту;
- Объяснить, почему начинающему программисту так сложно это понять.
И начнем мы, пожалуй, с последнего.
Почему так сложно понять Spring начинающему программисту?
Не знаю, слышали ли Вы или нет, но часто можно услышать мнение о том, как важно начинающему разработчику изучать так называемые «Паттерны прогроммирования«. Однако, если Вы достанете, к примеру вот эту легендарную книгу:

… вскоре в процессе прочтения ее, Вы обратите внимание на то, что большая часть этих самых паттернов и, собственно, мотивация их появления связаны с проблематикой специфичной именно для больших компаний с большой кодовой базой, частой проблемой рефакторинга, переиспользования кода разными программистами и так далее. Как правило на начальных этапах программист-стажер еще не сталкивается с подобными проблемами, поэтому он и не может понять, что такое «слабосвязанный код», для чего нужно использовать эти самые паттерны и тому подобное.
В видео чуть ниже я привожу конкретный пример, в каком случае мы можем упереться в проблему жесткой связанности кода. Кстати, еще одна проблема, о которой я не рассказываю ниже — это проблема тестирования отдельного «компонента», поведение которого жестко завязано на другой компонент. Оно (тестирование), как правило, затруднено в рамках большого проекта. Ну, а прежде чем Вы доберетесь до видео, давайте раскроем базовые понятия, столпы, на которых, собственно и строится Spring Framework:
Теория
Ну а теперь собственно видео, иллюстрирующее всю проблематику жесткосвязанного кода и потребность в Ioc и DI: