Media is too big
VIEW IN TELEGRAM
Пишем RestApi на SpringBoot Java + MySQL
Spring Initializr 00:00
IntellijIdea 01:34
GetMapping 04:28
Class 06:09
API Layer 08:47
PostMapping 11:20
Подключаем MySQL 13:46
Configuration 19:41
Extra Fields 21:57
DeleteMapping 23:22
PutMapping 26:37
Почти готово 31:42
Обработка исключений 31:59
Унифицируем Response 39:56
источник
👉@BookJava
Spring Initializr 00:00
IntellijIdea 01:34
GetMapping 04:28
Class 06:09
API Layer 08:47
PostMapping 11:20
Подключаем MySQL 13:46
Configuration 19:41
Extra Fields 21:57
DeleteMapping 23:22
PutMapping 26:37
Почти готово 31:42
Обработка исключений 31:59
Унифицируем Response 39:56
источник
👉@BookJava
👍4
Напоминание о необходимости переключить стартовую зависимость DGS на интеграцию DGS/Spring GraphQL.
Скоро это будет сделано по умолчанию, поэтому, пожалуйста, протестируйте свои приложения. Мы не заметили никаких проблем с переключением в Netflix 🙌.
https://netflix.github.io/dgs/spring-graphql-integration/
#Java #GraphQL #springboot
👉@BookJava
Скоро это будет сделано по умолчанию, поэтому, пожалуйста, протестируйте свои приложения. Мы не заметили никаких проблем с переключением в Netflix 🙌.
https://netflix.github.io/dgs/spring-graphql-integration/
#Java #GraphQL #springboot
👉@BookJava
👍2❤1🤮1
Spring Boot с ограничением скорости 🚀
Реализуйте ограничение скорости с помощью Bucket4j! 🚀
https://bucket4j.com/
#SpringBoot #RateLimiting
👉@BookJava
Реализуйте ограничение скорости с помощью Bucket4j! 🚀
https://bucket4j.com/
#SpringBoot #RateLimiting
👉@BookJava
👍10
Совет по JPA 🚀
Упростите свои #Java модели данных, встраивая сложные типы непосредственно в ваши сущности с помощью аннотации
#Hibernate #SpringBoot #JavaDevelopment #ORM
👉@BookJava
Упростите свои #Java модели данных, встраивая сложные типы непосредственно в ваши сущности с помощью аннотации
@Embedded в @JPA! Это идеально подходит для многократно используемых компонентов, таких как адреса. 🔥#Hibernate #SpringBoot #JavaDevelopment #ORM
👉@BookJava
👍7
Советы по Spring Boot💡
Улучшите сборку образа контейнера
https://paketo.io/docs/howto/java/#install-a-minimal-jre-with-jlink
#SpringBoot #Java
👉@BookJava
Улучшите сборку образа контейнера
@springboot с помощью #Jlink! https://paketo.io/docs/howto/java/#install-a-minimal-jre-with-jlink
#SpringBoot #Java
👉@BookJava
👍5
Совет по Spring Boot💡
Улучшите сборку образа контейнера
https://paketo.io/docs/howto/java/#install-a-minimal-jre-with-jlink
#SpringBoot #Java
👉@BookJava
Улучшите сборку образа контейнера
@springboot с помощью #Jlink! 🔥https://paketo.io/docs/howto/java/#install-a-minimal-jre-with-jlink
#SpringBoot #Java
👉@BookJava
❤5👍1
Media is too big
VIEW IN TELEGRAM
Хранилище файлов. Java + WebDav
Java + WebDav - загружаем файл на webdav через Rest запрос.
00:00 Приветствие
00:34 Spring Init
00:55 Docker Hub
01:54 docker-compose
04:25 webdav.conf
06:00 application.yaml
06:50 Sardine
07:36 WebDavConfig
09:15 WebConfig
11:40 FileService
14:09 Controller
17:22 Docker Fix
17:47 Postman
18:16 что не так?
20:46 Подписывайтесь
источник
👉@BookJava
Java + WebDav - загружаем файл на webdav через Rest запрос.
00:00 Приветствие
00:34 Spring Init
00:55 Docker Hub
01:54 docker-compose
04:25 webdav.conf
06:00 application.yaml
06:50 Sardine
07:36 WebDavConfig
09:15 WebConfig
11:40 FileService
14:09 Controller
17:22 Docker Fix
17:47 Postman
18:16 что не так?
20:46 Подписывайтесь
источник
👉@BookJava
👍5
@TransactionalEventListener — это специализированная версия @EventListener, которая прослушивает событие и ждёт завершения текущей транзакции, прежде чем сработать. Ожидание согласованного состояния базы данных позволяет безопаснее реагировать на изменения, внесённые в БД ✨
#Java #springboot
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4
☕️ Spring Core: Зачем нужна аннотация
Если вы работаете со Spring, вы видите эту аннотацию постоянно. Но чем она отличается от простого навешивания
💡 Что это такое?
Аннотация
🛠 Как это выглядит?
🔥 Когда использовать
Это самый частый вопрос на собеседованиях.
1. Используйте
- Это ваш класс. Вы имеете доступ к исходному коду.
- Вам нужна магия автоматического сканирования (
2. Используйте
- Сторонние библиотеки. Вы не можете зайти в класс
- Сложная логика создания. Если создание объекта требует условий (
⚙️ Фишки
- Имена: По умолчанию имя бина совпадает с именем метода. Можно изменить:
- Init/Destroy: Можно указать методы, которые сработают при создании или удалении бина:
- Зависимости: Если методу с
Итог:
#Java #Spring #SpringBoot #Coding #Education
📲 Мы в MAX
👉@BookJava
@Bean?Если вы работаете со Spring, вы видите эту аннотацию постоянно. Но чем она отличается от простого навешивания
@Component над классом? Давайте разберем.💡 Что это такое?
Аннотация
@Bean используется в методах конфигурационных классов (помеченных @Configuration). Она говорит Spring-контейнеру:"Эй, Spring! Выполни этот метод, возьми то, что он вернет, и сохрани этот объект у себя в контексте (ApplicationContext). Управляй им как бином".
🛠 Как это выглядит?
@Configuration
public class AppConfig {
// Мы явно создаем объект и отдаем его Спрингу
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper(); // Например, библиотека Jackson
}
}
🔥 Когда использовать
@Bean, а когда @Component?Это самый частый вопрос на собеседованиях.
1. Используйте
@Component (и @Service, @Repository), когда:- Это ваш класс. Вы имеете доступ к исходному коду.
- Вам нужна магия автоматического сканирования (
component scanning). Вы просто ставите аннотацию над классом, и Spring сам его находит.2. Используйте
@Bean, когда:- Сторонние библиотеки. Вы не можете зайти в класс
ObjectMapper (из Jackson) или AmazonS3Client и написать там @Component, потому что это чужой код (read-only). Чтобы добавить такой объект в контекст Spring, вы создаете для него метод с @Bean.- Сложная логика создания. Если создание объекта требует условий (
if/else) или сложной конфигурации, проще описать это в методе явно.⚙️ Фишки
@Bean- Имена: По умолчанию имя бина совпадает с именем метода. Можно изменить:
@Bean("myCoolBean").- Init/Destroy: Можно указать методы, которые сработают при создании или удалении бина:
@Bean(initMethod = "init", destroyMethod = "cleanup").- Зависимости: Если методу с
@Bean нужны аргументы, Spring автоматически найдет и подставит их из контекста.Итог:
@Component - для автоматизации своих классов, @Bean - для ручного контроля и чужих библиотек.#Java #Spring #SpringBoot #Coding #Education
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
🍃 Spring Boot: Магия или Логика? (IoC & Beans)
Когда вы запускаете Spring-приложение, происходит магия: все нужные объекты создаются сами, базы данных подключаются, сервер стартует.
Но за этой магией стоит четкий механизм - IoC Container (Inversion of Control / Инверсия управления).
📦 Что такое Application Context?
Представьте Spring как огромный завод.
🔴 Context (Контейнер) - это сам завод. Он управляет жизненным циклом объектов.
🔴 Bean (Бин) - это любая деталь (объект), которую этот завод создал и хранит у себя на складе.
Суть IoC:
🔴 Обычный подход: Вы сами управляете объектами (
🔴 Spring подход: Вы отдаете управление фреймворку. "Спринг, создай мне сервис и дай его, когда он понадобится". Spring - главный.
🏷 Как сделать Бин? (Аннотации)
Чтобы Spring узнал про ваши классы, их нужно пометить.
1.
2.
3.
4.
5.
💉 Dependency Injection (DI)
Главная фишка. Как один бин попадает внутрь другого?
Например,
❌ Способ 1: Через поле (Field Injection)
Почему плохо: Невозможно протестировать (как подсунуть мок?), скрытые зависимости, возможен
✅ Способ 2: Через конструктор (Constructor Injection)
Золотой стандарт современного Spring.
Плюсы: Поле
⚡ Лайфхак: Lombok
Чтобы не писать конструктор руками, используйте Lombok:
🔥 Итог
Spring, это просто "мешок с объектами" (Context), которые он создает сам и связывает друг с другом (DI).
🔴 Забудьте про
🔴 Используйте внедрение через конструктор.
🔴 Помечайте классы правильными аннотациями (
#SpringBoot #Java #IoC #DI #SpringTips
📲 Мы в MAX
👉@BookJava
Когда вы запускаете Spring-приложение, происходит магия: все нужные объекты создаются сами, базы данных подключаются, сервер стартует.
Но за этой магией стоит четкий механизм - IoC Container (Inversion of Control / Инверсия управления).
📦 Что такое Application Context?
Представьте Spring как огромный завод.
Суть IoC:
Service s = new Service()). Вы - главный.🏷 Как сделать Бин? (Аннотации)
Чтобы Spring узнал про ваши классы, их нужно пометить.
1.
@Component — Самая базовая аннотация. "Эй, Спринг, это бин, управляй им!".2.
@Service - Тот же @Component, но семантически говорит: "Здесь бизнес-логика".3.
@Repository - Тот же @Component, но для работы с БД (ловит специфичные ошибки баз данных).4.
@Controller / @RestController - Для обработки HTTP-запросов.5.
@Configuration + @Bean - Используется, когда нужно создать бин из чужого класса (библиотеки), код которого вы не можете пометить аннотацией @Component.💉 Dependency Injection (DI)
Главная фишка. Как один бин попадает внутрь другого?
Например,
UserService нуждается в UserRepository.❌ Способ 1: Через поле (Field Injection)
@Service
public class UserService {
@Autowired // ⚠️ Не рекомендуется!
private UserRepository repository;
}
Почему плохо: Невозможно протестировать (как подсунуть мок?), скрытые зависимости, возможен
NullPointerException.✅ Способ 2: Через конструктор (Constructor Injection)
Золотой стандарт современного Spring.
@Service
public class UserService {
private final UserRepository repository;
// @Autowired здесь не обязателен (в новых версиях Spring)
public UserService(UserRepository repository) {
this.repository = repository;
}
}
Плюсы: Поле
final (неизменяемое), легко тестировать (можно передать любой репозиторий в конструктор), сразу видно все зависимости класса.⚡ Лайфхак: Lombok
Чтобы не писать конструктор руками, используйте Lombok:
@Service
@RequiredArgsConstructor // Генерирует конструктор для final полей
public class UserService {
private final UserRepository repository; // Всё внедрится само!
}
🔥 Итог
Spring, это просто "мешок с объектами" (Context), которые он создает сам и связывает друг с другом (DI).
new Service().@Service, @Repository).#SpringBoot #Java #IoC #DI #SpringTips
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2🤡2
🧙♂️ Spring Boot: Магия под капотом (Starters & AutoConfig)
Вы когда-нибудь задумывались: почему вы просто добавляете одну строчку в
За этим стоят два кита Spring Boot: Starters и AutoConfiguration.
1️⃣ Starters (Стартеры) - "Всё включено"
В старом Spring, чтобы сделать веб-приложение, нужно было вручную найти версии для Spring MVC, Tomcat, Jackson, Validation API... и молиться, чтобы они были совместимы.
Starter — это готовый набор зависимостей (dependencies), собранный в один пакет. Это как "Комбо-обед" в ресторане.
🔴 Хотите Веб? Добавляете
* Внутри: Tomcat + Spring MVC + Jackson + Logback.
🔴 Хотите Тесты? Добавляете
*Внутри: JUnit + Mockito + AssertJ + Hamcrest.
Вам больше не нужно думать о версиях библиотек. Spring Boot следит за "BOM" (Bill of Materials) и гарантирует, что все версии внутри стартера дружат друг с другом.
2️⃣ AutoConfiguration - "Умный детектив"
Это мозг фреймворка. Когда приложение запускается, Spring Boot начинает сканировать ваш
Он рассуждает примерно так:
1. "Так, я вижу, что в зависимостях есть класс
2. "Я вижу классы Tomcat и Spring MVC?" "Значит, нужно поднять встроенный веб-сервер на порту 8080 и настроить
3. "О, программист сам создал свой бин
Вся эта логика держится на аннотациях
🔴
🔴
⚙️ Главная кнопка:
Вы вешаете эту аннотацию над
🕵️♂️ Pro-Tip: Как увидеть магию?
Иногда автоконфигурация мешает, или вы не понимаете, почему Spring решил подключить ту или иную базу.
Добавьте в
При запуске в консоль вывалится Condition Evaluation Report. Там будет честно написано:
🔴 ✅ Positive Matches: Что Spring настроил сам (и почему).
🔴 ❌ Negative Matches: Что Spring проигнорировал (потому что не нашел нужных классов или вы перекрыли это своим бином).
🔥 Итог
🔴 Starters экономят время на подбор зависимостей.
🔴 AutoConfiguration экономит время на написание рутинных конфигов.
🔴 Spring Boot работает по принципу Convention over Configuration (Соглашение важнее конфигурации): "Я дам тебе лучшие настройки по умолчанию, но ты всегда можешь их изменить".
#SpringBoot #Java #Starters #AutoConfig
📲 Мы в MAX
👉@BookJava
Вы когда-нибудь задумывались: почему вы просто добавляете одну строчку в
pom.xml, пишете main метод, и у вас волшебным образом поднимается Tomcat, настраивается JSON-конвертер и подключается логирование?За этим стоят два кита Spring Boot: Starters и AutoConfiguration.
1️⃣ Starters (Стартеры) - "Всё включено"
В старом Spring, чтобы сделать веб-приложение, нужно было вручную найти версии для Spring MVC, Tomcat, Jackson, Validation API... и молиться, чтобы они были совместимы.
Starter — это готовый набор зависимостей (dependencies), собранный в один пакет. Это как "Комбо-обед" в ресторане.
spring-boot-starter-web.* Внутри: Tomcat + Spring MVC + Jackson + Logback.
spring-boot-starter-test.*Внутри: JUnit + Mockito + AssertJ + Hamcrest.
Вам больше не нужно думать о версиях библиотек. Spring Boot следит за "BOM" (Bill of Materials) и гарантирует, что все версии внутри стартера дружат друг с другом.
2️⃣ AutoConfiguration - "Умный детектив"
Это мозг фреймворка. Когда приложение запускается, Spring Boot начинает сканировать ваш
classpath (все подключенные библиотеки jar).Он рассуждает примерно так:
1. "Так, я вижу, что в зависимостях есть класс
H2Driver?" "Значит, программист хочет базу данных. Создам-ка я ему бин DataSource с настройками для H2!"2. "Я вижу классы Tomcat и Spring MVC?" "Значит, нужно поднять встроенный веб-сервер на порту 8080 и настроить
DispatcherServlet."3. "О, программист сам создал свой бин
DataSource?" "Окей, тогда я отступаю и свою автоконфигурацию не применяю."Вся эта логика держится на аннотациях
@Conditional...:@ConditionalOnClass: Создать бин, если найден класс X.@ConditionalOnMissingBean: Создать бин, ТОЛЬКО если программист не создал такой же сам.⚙️ Главная кнопка:
@SpringBootApplicationВы вешаете эту аннотацию над
main классом. На самом деле это "матрешка", внутри которой спрятаны 3 другие аннотации:
@SpringBootConfiguration // Говорит: "Это конфигурационный класс"
@EnableAutoConfiguration // Говорит: "ВКЛЮЧИ МАГИЮ!" (запусти сканирование classpath)
@ComponentScan // Говорит: "Ищи пользовательские бины в этом пакете"
public @interface SpringBootApplication { ... }
🕵️♂️ Pro-Tip: Как увидеть магию?
Иногда автоконфигурация мешает, или вы не понимаете, почему Spring решил подключить ту или иную базу.
Добавьте в
application.properties одну строчку:
debug=true
При запуске в консоль вывалится Condition Evaluation Report. Там будет честно написано:
🔥 Итог
#SpringBoot #Java #Starters #AutoConfig
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🎮 Анатомия REST Controller: Входящие и Исходящие
Раньше, чтобы вернуть JSON, нужно было танцевать с бубном. В Spring Boot это делается "из коробки" благодаря библиотеке Jackson, которая тихо работает в фоне.
1️⃣
Это первый вопрос на собеседовании.
🔴
🔴
🔴 Это просто
🔴 Всё, что возвращает метод, автоматически превращается в JSON.
2️⃣ Принимаем данные (3 главных способа)
Как вытащить информацию из запроса?
А. Из пути URL (
Используем, когда параметр - это часть адреса ресурса.
🔴 URL:
🔴 Код:
Б. Из параметров запроса (
Используем для фильтрации, сортировки или опциональных параметров.
• URL:
• Код:
В. Из тела запроса (
Используем для отправки сложных объектов (обычно в POST/PUT запросах). Spring возьмет JSON и сам превратит его в Java-объект (DTO).
• JSON:
• Код:
3️⃣ Управляем ответом (
Просто вернуть объект
Для этого используем обертку
💻 Пример: Идеальный контроллер
⚡ Jackson Magic (Pro-Tip)
Иногда вам не нужно отдавать все поля объекта (например, пароль).
Не пишите код для скрытия! Используйте аннотации Jackson прямо в DTO:
•
•
🔥 Итог
• Используйте
•
•
•
• Возвращайте
#SpringBoot #REST #Controller #API #Java
📲 Мы в MAX
👉@BookJava
Раньше, чтобы вернуть JSON, нужно было танцевать с бубном. В Spring Boot это делается "из коробки" благодаря библиотеке Jackson, которая тихо работает в фоне.
1️⃣
@RestController vs @ControllerЭто первый вопрос на собеседовании.
@Controller: Олдскул. Используется, когда мы возвращаем HTML-страницы (Thymeleaf, JSP). Чтобы вернуть JSON, нужно над каждым методом вешать @ResponseBody.@RestController: Современный стандарт для REST API.@Controller + @ResponseBody над всеми методами.2️⃣ Принимаем данные (3 главных способа)
Как вытащить информацию из запроса?
А. Из пути URL (
@PathVariable)Используем, когда параметр - это часть адреса ресурса.
GET /users/42
@GetMapping("/users/{id}")
public User getById(@PathVariable Long id) { ... }
Б. Из параметров запроса (
@RequestParam)Используем для фильтрации, сортировки или опциональных параметров.
• URL:
GET /users?role=ADMIN&age=25• Код:
@GetMapping("/users")
public List<User> search(
@RequestParam String role,
@RequestParam(required = false) Integer age // Опционально
) { ... }
В. Из тела запроса (
@RequestBody)Используем для отправки сложных объектов (обычно в POST/PUT запросах). Spring возьмет JSON и сам превратит его в Java-объект (DTO).
• JSON:
{ "name": "Alex", "email": "a@b.com" }• Код:
@PostMapping("/users")
public User create(@RequestBody UserDto userDto) { ... }
3️⃣ Управляем ответом (
ResponseEntity)Просто вернуть объект
User, это хорошо (статус будет 200 OK). Но что, если мы хотим вернуть 404 (Not Found) или 201 (Created)?Для этого используем обертку
ResponseEntity<T>.💻 Пример: Идеальный контроллер
@RestController
@RequestMapping("/api/v1/users") // Общий префикс для всех методов
public class UserController {
private final UserService service; // Внедряем через конструктор
public UserController(UserService service) {
this.service = service;
}
// 1. Получить всех (GET 200 OK)
@GetMapping
public List<User> getAll() {
return service.findAll();
}
// 2. Найти одного (с управлением статусом)
@GetMapping("/{id}")
public ResponseEntity<User> getOne(@PathVariable Long id) {
return service.findById(id)
.map(user -> ResponseEntity.ok(user)) // 200 OK
.orElse(ResponseEntity.notFound().build()); // 404 Not Found
}
// 3. Создать (POST 201 Created)
@PostMapping
public ResponseEntity<User> create(@RequestBody UserDto dto) {
User created = service.save(dto);
return ResponseEntity.status(HttpStatus.CREATED).body(created);
}
}
⚡ Jackson Magic (Pro-Tip)
Иногда вам не нужно отдавать все поля объекта (например, пароль).
Не пишите код для скрытия! Используйте аннотации Jackson прямо в DTO:
•
@JsonIgnore - поле не попадет в JSON.•
@JsonProperty("full_name") - поле fullName в Java станет full_name в JSON.🔥 Итог
• Используйте
@RestController для API.•
@PathVariable - для ID (/users/1).•
@RequestParam - для фильтров (/users?sort=name).•
@RequestBody - для больших данных (JSON).• Возвращайте
ResponseEntity, чтобы контролировать HTTP-статусы.#SpringBoot #REST #Controller #API #Java
📲 Мы в MAX
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3