Все хвалят Spring, но его ведь невозможно понять!В свое время я прочитал целую кучу гайдов по Spring, но все равно думал, что это слишком сложная штука. Меня накрывало отчаяние, казалось, что я никогда не пойму о чем это вообще! Но спустя примерно миллион попыток, пазл наконец сошелся! Оказалось, что Spring на самом деле создан, чтобы жизнь облегчать, а не усложнять. Ниже расскажу о классических затыках, с которыми чаще всего сталкиваются новички (и я сам не раз обжигался), а заодно покажу, что все это реально преодолеть.
Зачем нужен Dependency Injection?Когда я впервые увидел аннотации Spring-а, то подумал: «Да зачем мне эти штуки, если могу сам объект создать?» Звучит же логично? Но потом поймал себя на том, что, когда вручную пихаешь зависимости, тесты писать сложно, да и код становится очень сильно связанный — изменяешь одно место, и нужно менять еще десять! Понял, что Spring забирает на себя массу ручной работы, и в итоге «все само заводится». Очень кайфово, когда объект “появляется” где нужно, а мне остается только писать логику.
Field Injection VS Constructor InjectionЕще одна загадка: почему в одном туториале указывают @Autowired прямо над полем, а в другом — все через конструктор? Изначально кажется: «Ну какая разница?» Но, как только начинаешь писать тесты, оказывается, что инжектить через конструктов куда гибче, особенно если надо мокнуть репозитории и сервисы. И хоть инжекция в поля на старте проще — потом это аукнется.
REST-контроллеры и исключенияБыло сложно разобраться, что такое контроллер в целом и что там нужно писать. А уж как только речь зашла об обработке ошибок, я совсем потерялся. Тут и @ControllerAdvice, и @ExceptionHandler, и прочие примочки. С ними приложение не просто обрабатывает ошибки в каком-то классе, а ловит исключения по всему приложению. В итоге не нужно писать один и тот же try-catch в каждом классе! Это разрыв шаблона.
Управление соединениями с базойВ эпоху Spring Data JPA редко кто вручную подключает базу себе в приложение, но все уроки начинаются с JDBC. Это может путать, когда первый раз с этим сталкиваешься. Легко забыть закрыть соединение, и в какой-то момент система просто ляжет от нехватки ресурсов.
Когда подключаются фишки Spring Data, выясняется, что вся эта головная боль уходит, потому что фреймворк берет на себя управление соединениями. Он сам открывает и закрывает их в нужный момент. Когда узнал об этом, только возмутился: «А что, так можно было?»
Старые подходы VS НовыеSpring развивается очень быстро. Например, есть RestTemplate, но он уже потихоньку уходит в прошлое, на смену приходит RestClient (пишите в комментариях, если интересно было бы почитать о нем). Когда начинаешь учиться, то и так много всего, а тут еще постоянно выходят новые инструменты.
Как понять, что из всего этого многообразия нужно сразу, а что можно учить, когда по факту понадобится? Моя главная ошибка: я закапывался в то, что вообще не нужно было на старте. Да многое из изученного тогда, мне до сих пор не пригодилось, хех!
Конфигурация через код VS PropertiesСначала я вписывал все урлы и ключи прямо в классах. Вот так:
String someUrl = "http://www.something.com"
Вроде удобно. Но параметры могут меняться и часто. Менять что ли код каждый раз? И ведь не только переписывать, но и собирать приложение в один файл и запускать его по новой! Один из важных принципов — хранить все настройки в application.properties или application.yml, использовать @Value или @ConfigurationProperties. Это сэкономит кучу времени.
Чтобы вы легко разобрались во всех хитросплетениях Spring, я провожу по нему Интенсив из трех частей:
• Основы Spring (Бины, DI, ApplicationContext, т.д.)
• Основы Spring Web (Controller-Service-DAO, REST, HTTP, т.д.)
• Практика: вместе сделаем веб-приложение на Spring Boot
Гарантирую захватывающие лекции, кучу анимаций и объяснение простыми словами! Регистрируйтесь по
ссылке, и встретимся в прямом эфире на Интенсиве!