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
☕️ 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
🚀 Redis + Spring Cache: Турбо-наддув для бэкенда
Самая медленная часть любого приложения это ввод-вывод (I/O). Поход в базу данных (Postgres/MySQL) это "долго" (миллисекунды). Поход в оперативную память это "мгновенно" (наносекунды).
Redis - это база данных, которая хранит всё в оперативной памяти (In-Memory). Она идеально подходит на роль кэша.
🧠 Как работает Spring Cache?
Spring предоставляет крутую абстракцию. Вам не нужно писать код для подключения к Redis в каждом методе. Вы просто вешаете аннотации, а Spring сам перехватывает вызов метода.
Алгоритм
1. Вызывается метод
2. Spring лезет в кэш (Redis) по ключу
3. Если данные есть (Cache Hit): Spring НЕ выполняет код метода, а сразу возвращает данные из кэша.
4. Если данных нет (Cache Miss): Spring выполняет метод (идет в БД), берет результат, кладет его в кэш и отдает вам.
🛠 Настройка (2 шага)
1. Зависимости
В
2. Включаем рубильник
Над главным классом вешаем
💻 Магия аннотаций
У нас есть 3 главные аннотации, которые вы обязаны знать:
1.
Вешаем над методами поиска (
Результат: Первый вызов займет 3 секунды. Второй, третий и тысячный вызов с тем же ID займут 0.001 секунды.
2.
Самая большая проблема кэширования - инвалидация. Если мы обновили данные юзера в БД, а в кэше осталась старая версия — это баг.
При обновлении или удалении мы должны очистить кэш.
Теперь при следующем вызове
3.
Используется реже. Метод выполняется всегда, а его результат кладется в кэш, обновляя старое значение.
🆚 Redis vs HashMap
"Зачем мне Redis, если я могу создать
1. Память: Если данных много,
2. Микросервисы: Если у вас запущено 3 экземпляра сервиса, у каждого будет свой
3. Живучесть: При перезагрузке приложения
⚠️ Важный нюанс: Serializable
Чтобы положить Java-объект в Redis, его нужно превратить в байты (сериализовать).
Ваши DTO и Entity должны реализовывать интерфейс
🔥 Итог: кэширование - это самый простой способ масштабирования.
🔴 Часто читаете, редко меняете? ->
🔴 Удалили/Обновили? ->
#Java #Spring #Redis #Caching #Performance
📲 Мы в MAX
👉@BookJava
Самая медленная часть любого приложения это ввод-вывод (I/O). Поход в базу данных (Postgres/MySQL) это "долго" (миллисекунды). Поход в оперативную память это "мгновенно" (наносекунды).
Redis - это база данных, которая хранит всё в оперативной памяти (In-Memory). Она идеально подходит на роль кэша.
🧠 Как работает Spring Cache?
Spring предоставляет крутую абстракцию. Вам не нужно писать код для подключения к Redis в каждом методе. Вы просто вешаете аннотации, а Spring сам перехватывает вызов метода.
Алгоритм
@Cacheable:1. Вызывается метод
getUser(1).2. Spring лезет в кэш (Redis) по ключу
user::1.3. Если данные есть (Cache Hit): Spring НЕ выполняет код метода, а сразу возвращает данные из кэша.
4. Если данных нет (Cache Miss): Spring выполняет метод (идет в БД), берет результат, кладет его в кэш и отдает вам.
🛠 Настройка (2 шага)
1. Зависимости
В
pom.xml добавляем стартер для кэша и драйвер Redis:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. Включаем рубильник
Над главным классом вешаем
@EnableCaching.💻 Магия аннотаций
У нас есть 3 главные аннотации, которые вы обязаны знать:
1.
@Cacheable — "Запомни меня"Вешаем над методами поиска (
get, find).
@Service
public class UserService {
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
// Имитация долгого запроса в БД (3 секунды)
simulateSlowService();
return userRepository.findById(id).orElseThrow();
}
}
Результат: Первый вызов займет 3 секунды. Второй, третий и тысячный вызов с тем же ID займут 0.001 секунды.
2.
@CacheEvict - "Забудь меня"Самая большая проблема кэширования - инвалидация. Если мы обновили данные юзера в БД, а в кэше осталась старая версия — это баг.
При обновлении или удалении мы должны очистить кэш.
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
Теперь при следующем вызове
getUserById(id) Spring увидит, что кэш пуст, и снова сходит в БД за свежими данными.3.
@CachePut - "Обнови меня"Используется реже. Метод выполняется всегда, а его результат кладется в кэш, обновляя старое значение.
🆚 Redis vs HashMap
"Зачем мне Redis, если я могу создать
ConcurrentHashMap прямо в Java?"1. Память: Если данных много,
HashMap съест всю память JVM, и приложение упадет (OutOfMemory). Redis живет отдельно.2. Микросервисы: Если у вас запущено 3 экземпляра сервиса, у каждого будет свой
HashMap. Кэш будет рассинхронизирован. Redis это общий кэш для всех инстансов.3. Живучесть: При перезагрузке приложения
HashMap очищается. Redis (обычно) работает на отдельном сервере и хранит данные даже при рестарте вашего кода.⚠️ Важный нюанс: Serializable
Чтобы положить Java-объект в Redis, его нужно превратить в байты (сериализовать).
Ваши DTO и Entity должны реализовывать интерфейс
Serializable, либо (что правильнее) нужно настроить Jackson Serializer, чтобы хранить данные в Redis в читаемом JSON-формате.🔥 Итог: кэширование - это самый простой способ масштабирования.
@Cacheable.@CacheEvict.#Java #Spring #Redis #Caching #Performance
📲 Мы в MAX
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7