Сравните репозитории Spring Data
Основная часть работы в Spring Data строится вокруг интерфейса Repository. Это маркерный интерфейс. От него наследуются интерфейсы-специализации, которые уже содержат методы для работы с сущностями базы данных. Все эти интерфейсы параметризуются двумя типами: самой сущности и её идентификатора.
CrudRepository – базовый набор операций над сущностями: создание, чтение, изменение и удаление (CRUD).
PagingAndSortingRepository – добавляет к CRUD возможность постраничной загрузки данных с определенной сортировкой.
JpaRepository – расширение PagingAndSortingRepository, полноценно реализующее Java Persistence API. Добавляет ряд методов, таких как например flush и deleteInBatch.
MongoRepository – расширение PagingAndSortingRepository, специфичное для MongoDB.
Вспомогательные методы, специфичные для конкретной модели данных, добавляются в пользовательские интерфейсы-наследники. Основываясь на именах добавляемых методов, фреймворк сам создаёт их реализацию.
Основная часть работы в Spring Data строится вокруг интерфейса Repository. Это маркерный интерфейс. От него наследуются интерфейсы-специализации, которые уже содержат методы для работы с сущностями базы данных. Все эти интерфейсы параметризуются двумя типами: самой сущности и её идентификатора.
CrudRepository – базовый набор операций над сущностями: создание, чтение, изменение и удаление (CRUD).
PagingAndSortingRepository – добавляет к CRUD возможность постраничной загрузки данных с определенной сортировкой.
JpaRepository – расширение PagingAndSortingRepository, полноценно реализующее Java Persistence API. Добавляет ряд методов, таких как например flush и deleteInBatch.
MongoRepository – расширение PagingAndSortingRepository, специфичное для MongoDB.
Вспомогательные методы, специфичные для конкретной модели данных, добавляются в пользовательские интерфейсы-наследники. Основываясь на именах добавляемых методов, фреймворк сам создаёт их реализацию.
👍12🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Приглашаем мобильных и бэкенд-разработчиков на Яндекс Go Day&Night
Конференция в двух частях: днём делимся докладами о мобильной и бэкенд-разработке, а после заката устраиваем тусовку.
Формат: Офлайн
Дата и время: 20 апреля, 14:00 - 02:00
Бесплатно. Регистрация обязательна. Заявки проходят модерацию, количество мест ограничено.
Подробнее
Реклама. ООО «Яндекс» ИНН 7736207543
Конференция в двух частях: днём делимся докладами о мобильной и бэкенд-разработке, а после заката устраиваем тусовку.
Формат: Офлайн
Дата и время: 20 апреля, 14:00 - 02:00
Бесплатно. Регистрация обязательна. Заявки проходят модерацию, количество мест ограничено.
Подробнее
Реклама. ООО «Яндекс» ИНН 7736207543
👍3🔥2
Когда используют Aware интерфейсы в Spring?
В Spring Framework существует большое количество «глобальных» (в рамках какого-либо скоупа) сущностей-синглтонов, которые не являются бинами. Естественно, все сразу они не нужны ни одному бину, обычный механизм внедрения для них не работает. Но тем не менее, должен существовать способ воспользоваться их функциональностью.
Маркерный интерфейс Aware служит родителем большому количеству интерфейсов с именами *Aware. Каждый из них, при реализации, доставляет бину какую-то специфичную для себя сущность. Так, например, компонент, которому нужно обратиться к контексту приложения, должен реализовывать ApplicationContextAware.
Технически, сами интерфейсы ничего не делают. Интерфейс FooAware обычно объявляет единственный метод void setFoo(Foo value). Через этот метод связанный с интерфейсом BeanPostProcessor передаст в бин нужную сущность.
Если бин реализует ServletContextAware, то в процессе инициализации бина к нему придет ServletContextAwareProcessor, и вызовет setServletContext с контекстом сервлета в качестве параметра.
В Spring Framework существует большое количество «глобальных» (в рамках какого-либо скоупа) сущностей-синглтонов, которые не являются бинами. Естественно, все сразу они не нужны ни одному бину, обычный механизм внедрения для них не работает. Но тем не менее, должен существовать способ воспользоваться их функциональностью.
Маркерный интерфейс Aware служит родителем большому количеству интерфейсов с именами *Aware. Каждый из них, при реализации, доставляет бину какую-то специфичную для себя сущность. Так, например, компонент, которому нужно обратиться к контексту приложения, должен реализовывать ApplicationContextAware.
Технически, сами интерфейсы ничего не делают. Интерфейс FooAware обычно объявляет единственный метод void setFoo(Foo value). Через этот метод связанный с интерфейсом BeanPostProcessor передаст в бин нужную сущность.
Если бин реализует ServletContextAware, то в процессе инициализации бина к нему придет ServletContextAwareProcessor, и вызовет setServletContext с контекстом сервлета в качестве параметра.
👍20🔥4❤2
Что выведет следующий код?
Anonymous Quiz
20%
NullPointerException
13%
ClassCastException
13%
Integer
54%
Код не скомпилируется
👍13🔥3
Вебинар для разработчиков и архитекторов
Приходите на живой эфир и вы узнаете:
- как использовать события для асинхронного взаимодействия;
- какие это дает плюсы и минусы по сравнению с request-reply архитектурой;
- некоторые паттерны реализации систем с использованием событий.
Занятие пройдёт 22 апреля в 19:00 мск в рамках набора на онлайн-курс «Software Architect». Спикер — опытный разработчик на С++, Java, Kotlin и Kafka. Для участников вебинара будет доступна специальная цена на обучение.
🌐 Зарегистрируйтесь, чтобы посетить открытый урок: https://vk.cc/cwbaDg
Приходите на живой эфир и вы узнаете:
- как использовать события для асинхронного взаимодействия;
- какие это дает плюсы и минусы по сравнению с request-reply архитектурой;
- некоторые паттерны реализации систем с использованием событий.
Занятие пройдёт 22 апреля в 19:00 мск в рамках набора на онлайн-курс «Software Architect». Спикер — опытный разработчик на С++, Java, Kotlin и Kafka. Для участников вебинара будет доступна специальная цена на обучение.
🌐 Зарегистрируйтесь, чтобы посетить открытый урок: https://vk.cc/cwbaDg
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍5🔥2❤1
Какая разница между @Controller и @RestController?
Controller – это один из стереотипов Spring Framework. Компоненты такого типа обычно занимаются обработкой сетевых запросов. Контроллер состоит из набора методов-обработчиков, помеченных аннотацией @RequestMapping.
Ответ на запрос можно сформировать разными способами: например просто вернуть из обработчика строку с именем jsp-файла, или же вернуть ResponseBodyEmitter, который будет асинхронно заполняться данными позже. Все возможные варианты перечислены в документации.
Большинство современных API реализуется по архитектуре REST. В ней каждая сущность доступна под собственным URI. В методе-обработчике возвращается экземпляр класса этой сущности, который преобразуется в ответ сервера одним из HttpMessageConverter-ов. Например, в JSON его превратит MappingJackson2HttpMessageConverter. Чтобы использовать этот способ ответа, метод, или весь контроллер, должен иметь аннотацию @ResponseBody.
@RestController – это просто сокращенная запись для @Controller + @ResponseBody.
Controller – это один из стереотипов Spring Framework. Компоненты такого типа обычно занимаются обработкой сетевых запросов. Контроллер состоит из набора методов-обработчиков, помеченных аннотацией @RequestMapping.
Ответ на запрос можно сформировать разными способами: например просто вернуть из обработчика строку с именем jsp-файла, или же вернуть ResponseBodyEmitter, который будет асинхронно заполняться данными позже. Все возможные варианты перечислены в документации.
Большинство современных API реализуется по архитектуре REST. В ней каждая сущность доступна под собственным URI. В методе-обработчике возвращается экземпляр класса этой сущности, который преобразуется в ответ сервера одним из HttpMessageConverter-ов. Например, в JSON его превратит MappingJackson2HttpMessageConverter. Чтобы использовать этот способ ответа, метод, или весь контроллер, должен иметь аннотацию @ResponseBody.
@RestController – это просто сокращенная запись для @Controller + @ResponseBody.
👍12🔥4
🧑💻Ты Java-разработчик?
Присоединяйся к IT_One CAREER HACKATHON 2024! 💚
Приглашаем Java-разработчиков, ИТ-специалистов уровня junior, middle и senior, провести 3 дня за решением кейса от IT_One.
🚀Рассказываем подробнее:
- Кейс, который предстоит решить: Разработка приложения для управления финансами
- Формат: мероприятие пройдёт онлайн
- Даты хакатона: 17 - 19 мая 2024
- Дедлайн регистрации: до 13.05.2024, 23:59 МСК
🔥Что тебя ждёт?
- Новый кейс в портфолио
- Мерч для победителей и сертификаты всем участникам
- Призовой фонд – 500.000 рублей
- Встречи с экспертами и питчи
- Командная работа
Проведи выходные с максимальной пользой, участвуй в хакатоне и решай задачу под руководством специалистов на хакатоне от IT_One! 💚
Регистрация уже доступна по ссылке: https://tglink.io/5cea8e07102e
Присоединяйся к IT_One CAREER HACKATHON 2024! 💚
Приглашаем Java-разработчиков, ИТ-специалистов уровня junior, middle и senior, провести 3 дня за решением кейса от IT_One.
🚀Рассказываем подробнее:
- Кейс, который предстоит решить: Разработка приложения для управления финансами
- Формат: мероприятие пройдёт онлайн
- Даты хакатона: 17 - 19 мая 2024
- Дедлайн регистрации: до 13.05.2024, 23:59 МСК
🔥Что тебя ждёт?
- Новый кейс в портфолио
- Мерч для победителей и сертификаты всем участникам
- Призовой фонд – 500.000 рублей
- Встречи с экспертами и питчи
- Командная работа
Проведи выходные с максимальной пользой, участвуй в хакатоне и решай задачу под руководством специалистов на хакатоне от IT_One! 💚
Регистрация уже доступна по ссылке: https://tglink.io/5cea8e07102e
👍6🔥3
Как вызвать транзакционный метод из того же класса?
В Spring Framework существует аннотация @Transactional. Ей помечается метод или класс, весь код которого должен выполняться в рамках транзакции. Обычно имеется в виду транзакция базы данных, но вообще это понятие определяется используемым transactionManager-ом. Настройки, такие как уровень изоляции, стратегия роллбэка и прочие, определяются через параметры этой аннотации.
В теории, @Transactional делает метод транзакционным для этого класса и всех его наследников. На практике же, по умолчанию, если вызвать транзакционный метод Foo.bar() из Foo.baz(), то транзакция не создастся.
Это происходит вследствие того, что по умолчанию Spring AOP добавляет код открытия/закрытия транзакции через динамический proxy класс. То есть, вместо Foo инджектится нечто, похожее на код на изображении.
Первый вариант решения проблемы – вместо аннотации использовать TransactionTemplate, то есть обернуть код в транзакцию вручную. Примеры использования можно посмотреть в этой статье.
Другой, более универсальный, но более сложный в конфигурации способ – переключить режим работы Spring AOP с динамических прокси на нечто другое. Обычно применяется библиотека AspectJ:
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
В Spring AOP есть понятие weaving – этап добавления дополнительной функциональности (аспектов). В нашем случае, это код открытия/закрытия транзакции. Чтобы заработал weaving AspectJ этапа компиляции, в сборку нужно добавить плагин: aspectj-maven-plugin для maven, gradle-aspectj для gradle.
В Spring Framework существует аннотация @Transactional. Ей помечается метод или класс, весь код которого должен выполняться в рамках транзакции. Обычно имеется в виду транзакция базы данных, но вообще это понятие определяется используемым transactionManager-ом. Настройки, такие как уровень изоляции, стратегия роллбэка и прочие, определяются через параметры этой аннотации.
В теории, @Transactional делает метод транзакционным для этого класса и всех его наследников. На практике же, по умолчанию, если вызвать транзакционный метод Foo.bar() из Foo.baz(), то транзакция не создастся.
Это происходит вследствие того, что по умолчанию Spring AOP добавляет код открытия/закрытия транзакции через динамический proxy класс. То есть, вместо Foo инджектится нечто, похожее на код на изображении.
Первый вариант решения проблемы – вместо аннотации использовать TransactionTemplate, то есть обернуть код в транзакцию вручную. Примеры использования можно посмотреть в этой статье.
Другой, более универсальный, но более сложный в конфигурации способ – переключить режим работы Spring AOP с динамических прокси на нечто другое. Обычно применяется библиотека AspectJ:
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
В Spring AOP есть понятие weaving – этап добавления дополнительной функциональности (аспектов). В нашем случае, это код открытия/закрытия транзакции. Чтобы заработал weaving AspectJ этапа компиляции, в сборку нужно добавить плагин: aspectj-maven-plugin для maven, gradle-aspectj для gradle.
👍16🔥3❤1👏1
Из джуна в мидла вместе с Холдингом Т1🚀 Приглашаем java-разработчиков в Открытые школы Т1!
🎓 Открытые школы Т1 — это новая карьерная программа для IТ-специалистов, объединяющая обучение без отрыва от работы и offer weeks.
👨💻 Для участия необходим опыт работы java-разработчиком от 1 года, а также желание присоединиться к команде Т1.
Т1 занимает 2 место среди крупнейших ИКТ-компаний по версии RAEX 2023 и является партнёром ключевых производителей и разработчиков в сфере ИТ.
В программу входит: spring framework; docker; синхронное и асинхронное взаимодействие, брокеры сообщений; паттерны, SOLID
⏰ Длительность 1 месяц.
💻 Формат: онлайн по вечерам (от 8 часов в неделю на вебинары и практику).
Лучшим назначим интервью и направим оффер!
📌 Подробнее о программе — в карточках внутри поста.
Принимаем заявки до 22 апреля! 🚀
Реклама. ООО "Т1". ИНН 7720484492.
🎓 Открытые школы Т1 — это новая карьерная программа для IТ-специалистов, объединяющая обучение без отрыва от работы и offer weeks.
👨💻 Для участия необходим опыт работы java-разработчиком от 1 года, а также желание присоединиться к команде Т1.
Т1 занимает 2 место среди крупнейших ИКТ-компаний по версии RAEX 2023 и является партнёром ключевых производителей и разработчиков в сфере ИТ.
В программу входит: spring framework; docker; синхронное и асинхронное взаимодействие, брокеры сообщений; паттерны, SOLID
⏰ Длительность 1 месяц.
💻 Формат: онлайн по вечерам (от 8 часов в неделю на вебинары и практику).
Лучшим назначим интервью и направим оффер!
📌 Подробнее о программе — в карточках внутри поста.
Принимаем заявки до 22 апреля! 🚀
Реклама. ООО "Т1". ИНН 7720484492.
👍5🔥2👌1
Опишите жизненный цикл Spring Bean
Beans – центральный объект заботы Spring Framework. За кулисами фреймворка с ними происходит множество процессов. Во многие из них можно вмешаться, добавив собственную логику в разные этапы жизненного цикла. Через следующие этапы проходит каждый отдельно взятый бин:
1. Инстанцирование объекта. Техническое начало жизни бина, работа конструктора его класса;
2. Установка свойств из конфигурации бина, внедрение зависимостей;
3. Нотификация aware-интерфейсов. BeanNameAware, BeanFactoryAware и другие. Мы уже писали о таких интерфейсах ранее. Технически, выполняется системными подтипами BeanPostProcessor, и совпадает с шагом 4;
4. Пре-инициализация – метод postProcessBeforeInitialization() интерфейса BeanPostProcessor;
5. Инициализация. Разные способы применяются в таком порядке:
• Метод бина с аннотацией @PostConstruct из стандарта JSR-250 (рекомендуемый способ);
• Метод afterPropertiesSet() бина под интерфейсом InitializingBean;
• Init-метод. Для отдельного бина его имя устанавливается в параметре определения initMethod. В xml-конфигурации можно установить для всех бинов сразу, с помощью default-init-method;
6. Пост-инициализация – метод postProcessAfterInitialization() интерфейса BeanPostProcessor.
Когда IoC-контейнер завершает свою работу, мы можем кастомизировать этап штатного уничтожения бина. Как со всеми способами финализации в Java, при жестком выключении (kill -9) гарантии вызова этого этапа нет. Три альтернативных способа «деинициализации» вызываются в том же порядке, что симметричные им методы инициализации:
1. Метод с аннотацией @PreDestroy;
2. Метод с именем, которое указано в свойстве destroyMethod определния бина (или в глобальном default-destroy-method);
3. Метод destroy() интерфейса DisposableBean.
Не следует путать жизненный цикл отдельного бина с жизненным циклом контекста и этапами подготовки фабрик бинов. О них мы поговорим в будущих публикациях.
Beans – центральный объект заботы Spring Framework. За кулисами фреймворка с ними происходит множество процессов. Во многие из них можно вмешаться, добавив собственную логику в разные этапы жизненного цикла. Через следующие этапы проходит каждый отдельно взятый бин:
1. Инстанцирование объекта. Техническое начало жизни бина, работа конструктора его класса;
2. Установка свойств из конфигурации бина, внедрение зависимостей;
3. Нотификация aware-интерфейсов. BeanNameAware, BeanFactoryAware и другие. Мы уже писали о таких интерфейсах ранее. Технически, выполняется системными подтипами BeanPostProcessor, и совпадает с шагом 4;
4. Пре-инициализация – метод postProcessBeforeInitialization() интерфейса BeanPostProcessor;
5. Инициализация. Разные способы применяются в таком порядке:
• Метод бина с аннотацией @PostConstruct из стандарта JSR-250 (рекомендуемый способ);
• Метод afterPropertiesSet() бина под интерфейсом InitializingBean;
• Init-метод. Для отдельного бина его имя устанавливается в параметре определения initMethod. В xml-конфигурации можно установить для всех бинов сразу, с помощью default-init-method;
6. Пост-инициализация – метод postProcessAfterInitialization() интерфейса BeanPostProcessor.
Когда IoC-контейнер завершает свою работу, мы можем кастомизировать этап штатного уничтожения бина. Как со всеми способами финализации в Java, при жестком выключении (kill -9) гарантии вызова этого этапа нет. Три альтернативных способа «деинициализации» вызываются в том же порядке, что симметричные им методы инициализации:
1. Метод с аннотацией @PreDestroy;
2. Метод с именем, которое указано в свойстве destroyMethod определния бина (или в глобальном default-destroy-method);
3. Метод destroy() интерфейса DisposableBean.
Не следует путать жизненный цикл отдельного бина с жизненным циклом контекста и этапами подготовки фабрик бинов. О них мы поговорим в будущих публикациях.
👍19🔥4❤2
Добавьте в свое портфолио кейс по решению задачи с микросервисной архитектурой бесплатно и всего за пару часов
На практическом уроке «Масштабируемая архитектура для систем обработки платежей».
На вебинаре:
- рассмотрим решение задачи по построению масштабируемой отказоустойчивой системы обработки платежей;
- обсудим применения шардирования, паттерна Saga, двухфазного коммита и выбор уровня изоляции транзакций;
- получим описание верхнеуровневой архитектуры.
Занятие пройдёт 24 апреля в 20:00 мск в рамках курса «Microservice Architecture». Доступна рассрочка на обучение!
Чтобы посетить открытый урок, зарегистрируйтесь: https://vk.cc/cwfziC
На практическом уроке «Масштабируемая архитектура для систем обработки платежей».
На вебинаре:
- рассмотрим решение задачи по построению масштабируемой отказоустойчивой системы обработки платежей;
- обсудим применения шардирования, паттерна Saga, двухфазного коммита и выбор уровня изоляции транзакций;
- получим описание верхнеуровневой архитектуры.
Занятие пройдёт 24 апреля в 20:00 мск в рамках курса «Microservice Architecture». Доступна рассрочка на обучение!
Чтобы посетить открытый урок, зарегистрируйтесь: https://vk.cc/cwfziC
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍6🔥2
Как использовать JavaEE сервлет в Spring Framework?
Web-приложение на Spring MVC технически само по себе работает на сервлетах: всю обработку запросов берет на себя единый DispatcherServlet. С его помощью реализуется паттерн Front Controller.
Если вам нужно определить в программе полностью независимый от Spring-контекста сервлет или фильтр, ничего особенного для этого делать не нужно. Как обычно в Servlet API, нужно объявить класс, добавить его в web.xml как сервлет, добавить для сервлета маппинг.
Сервлет живет вне Spring-контекста, внедрение зависимостей в нём просто так не заработает. Чтобы использовать autowiring, на этапе инициализации сервлета вызывается статический SpringBeanAutowiringSupport.processInjectionBasedOnServletContext, с текущим сервлетом и его контекстом в аргументах. В этом же утилитарном классе есть ряд других средств для работы с контекстом извне.
Если программа построена на Spring Boot, создание бина типа ServletRegistrationBean поможет добавить сервлеты в рантайме. А для декларативного добавления на этапе компиляции, к классу конфигурации применяется @ServletComponentScan. С этой аннотацией стартер приложения просканирует и добавит в контекст все web-компоненты в стиле Servlet 3.0: классы с аннотациями @WebFilter, @WebListener и @WebServlet.
Web-приложение на Spring MVC технически само по себе работает на сервлетах: всю обработку запросов берет на себя единый DispatcherServlet. С его помощью реализуется паттерн Front Controller.
Если вам нужно определить в программе полностью независимый от Spring-контекста сервлет или фильтр, ничего особенного для этого делать не нужно. Как обычно в Servlet API, нужно объявить класс, добавить его в web.xml как сервлет, добавить для сервлета маппинг.
Сервлет живет вне Spring-контекста, внедрение зависимостей в нём просто так не заработает. Чтобы использовать autowiring, на этапе инициализации сервлета вызывается статический SpringBeanAutowiringSupport.processInjectionBasedOnServletContext, с текущим сервлетом и его контекстом в аргументах. В этом же утилитарном классе есть ряд других средств для работы с контекстом извне.
Если программа построена на Spring Boot, создание бина типа ServletRegistrationBean поможет добавить сервлеты в рантайме. А для декларативного добавления на этапе компиляции, к классу конфигурации применяется @ServletComponentScan. С этой аннотацией стартер приложения просканирует и добавит в контекст все web-компоненты в стиле Servlet 3.0: классы с аннотациями @WebFilter, @WebListener и @WebServlet.
🔥10👍6
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Пройди тест по Java и проверь свои знания.
Ответишь — пройдешь на продвинутый курс «Java Developer. Professional» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
🔝 Обновленная, расширенная программа
👉 ПРОЙТИ ТЕСТ: https://otus.pw/AxWa/?erid=LjN8KF9Af
Ответишь — пройдешь на продвинутый курс «Java Developer. Professional» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
🔝 Обновленная, расширенная программа
👉 ПРОЙТИ ТЕСТ: https://otus.pw/AxWa/?erid=LjN8KF9Af
👍5🔥2
В чём преимущества и недостатки Spring Boot?
Основные сущности фреймворка Spring Boot – это стартеры. Зависимости с названиями вида spring-boot-starter-xxx выполняют две основных задачи. Во-первых, они добавляют набор типичных сторонних библиотек-зависимостей; во-вторых, регистрируют типичные бины и их конфигурации. Кроме того, со Spring Boot в проекте появляется ряд таких полезностей, как embedded-сервер, конфигурация web-приложения без web.xml, метрики, properties вынесенные из кода во внешние файлы.
Например, spring-boot-starter-data-jpa даст вам готовый комплект всего необходимого для использования JPA: драйвер, совместимую с ним версию Hibernate, библиотеки Persistence API и Spring Data. В контексте приложения появятся все нужные для JPA репозиториев бины.
Таким образом Spring Boot ускоряет и упрощает разработку, дает возможность избавиться от boilerplate-кода в проекте и сфокусироваться на бизнес-задачах. Это бывает особенно важно в микросервисной архитектуре, когда создается большое количество приложений.
С другой стороны, такая избыточность естественно приводит к большей тяжеловесности и медлительности приложения.
Основные сущности фреймворка Spring Boot – это стартеры. Зависимости с названиями вида spring-boot-starter-xxx выполняют две основных задачи. Во-первых, они добавляют набор типичных сторонних библиотек-зависимостей; во-вторых, регистрируют типичные бины и их конфигурации. Кроме того, со Spring Boot в проекте появляется ряд таких полезностей, как embedded-сервер, конфигурация web-приложения без web.xml, метрики, properties вынесенные из кода во внешние файлы.
Например, spring-boot-starter-data-jpa даст вам готовый комплект всего необходимого для использования JPA: драйвер, совместимую с ним версию Hibernate, библиотеки Persistence API и Spring Data. В контексте приложения появятся все нужные для JPA репозиториев бины.
Таким образом Spring Boot ускоряет и упрощает разработку, дает возможность избавиться от boilerplate-кода в проекте и сфокусироваться на бизнес-задачах. Это бывает особенно важно в микросервисной архитектуре, когда создается большое количество приложений.
С другой стороны, такая избыточность естественно приводит к большей тяжеловесности и медлительности приложения.
👍10🔥3❤2
🧙♂️Что может помочь, чтобы продвинуться в Java-разработке: магия или практика?
Расскажем на курсе "Разработчик на Spring Framework" от OTUS.
🤣 Принимаем в свой орден до конца мая
⚡️ Пройди тест по Java от OTUS и проверь, готов ли ты к обучению на нашем курсе?
Ответишь — пройдешь на курс по специальной цене.
👉 ПРОЙТИ ТЕСТ: https://otus.pw/VI80/
🎫 Курс можно приобрести в рассрочку
Расскажем на курсе "Разработчик на Spring Framework" от OTUS.
Ответишь — пройдешь на курс по специальной цене.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2