Большинство воспринимает Spring Boot просто как фреймворк для создания REST API.
Но за ним скрывается гораздо более крупная экосистема 👇
• Spring Core и внедрение зависимостей
• Spring MVC и WebFlux
• JPA, Hibernate и базы данных
• Безопасность с JWT и OAuth 2.0
• Kafka и RabbitMQ
• Redis и распределённое кэширование
• Docker, Kubernetes и облачные платформы
• Мониторинг с Actuator, Prometheus и Grafana
Spring Boot упрощает настройку проекта, а понимание всех стоящих за ним уровней помогает стать сильнее как бэкенд-разработчик.
Фреймворк позволяет быстро начать работу.
Экосистема помогает создавать приложения для продакшена.
👉 Java Portal
Но за ним скрывается гораздо более крупная экосистема 👇
• Spring Core и внедрение зависимостей
• Spring MVC и WebFlux
• JPA, Hibernate и базы данных
• Безопасность с JWT и OAuth 2.0
• Kafka и RabbitMQ
• Redis и распределённое кэширование
• Docker, Kubernetes и облачные платформы
• Мониторинг с Actuator, Prometheus и Grafana
Spring Boot упрощает настройку проекта, а понимание всех стоящих за ним уровней помогает стать сильнее как бэкенд-разработчик.
Фреймворк позволяет быстро начать работу.
Экосистема помогает создавать приложения для продакшена.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
💡 @NonNull и @Nullable помогают IDE находить ошибки.
✅ Указывают, какие значения могут быть
✅ Инструменты предупреждают о возможных
👉 Java Portal
✅ Указывают, какие значения могут быть
null.✅ Инструменты предупреждают о возможных
NullPointerException (NPE) прямо во время написания кода.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Большая коллекция из практических рекомендаций по защите приложений. Внутри: SQL Injection, XSS, JWT, OAuth2, Kubernetes, Docker, API Security, а теперь ещё и безопасность агентов MCP и RAG.
https://cheatsheetseries.owasp.org
👉 Java Portal
https://cheatsheetseries.owasp.org
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💡 Не создавай новый
✅ Создание потоков требует ресурсов, а пул позволяет повторно использовать уже созданные потоки.
✅
✅ Когда работа завершена, не забудь вызвать
👉 Java Portal
Thread() для каждой задачи — используй пул потоков.✅ Создание потоков требует ресурсов, а пул позволяет повторно использовать уже созданные потоки.
✅
Executor ограничивает количество задач, выполняемых одновременно.✅ Когда работа завершена, не забудь вызвать
shutdown(), чтобы корректно завершить работу пула.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Инструмент недели: Kubetail
Разбирать логи в Kubernetes бывает непросто: приходится переключаться между подами, запускать
Kubetail open-source инструмент для просмотра логов Kubernetes в реальном времени. Он собирает логи из нескольких подов в одном интерфейсе, упрощая отладку приложений.
Что умеет:
• Показывать логи нескольких подов и контейнеров одновременно.
• Обновлять временную шкалу при появлении, остановке и замене подов.
• Фильтровать логи по временному диапазону, зоне доступности, архитектуре CPU и узлу.
• Переключаться между несколькими кластерами через десктопное приложение.
Полезный инструмент для тех, кто работает с Kubernetes и хочет тратить меньше времени на поиск ошибок в логах.
GitHub: https://github.com/kubetail-org/kubetail
👉 Java Portal
Разбирать логи в Kubernetes бывает непросто: приходится переключаться между подами, запускать
kubectl logs и искать причину ошибки среди множества реплик приложения.Kubetail open-source инструмент для просмотра логов Kubernetes в реальном времени. Он собирает логи из нескольких подов в одном интерфейсе, упрощая отладку приложений.
Что умеет:
• Показывать логи нескольких подов и контейнеров одновременно.
• Обновлять временную шкалу при появлении, остановке и замене подов.
• Фильтровать логи по временному диапазону, зоне доступности, архитектуре CPU и узлу.
• Переключаться между несколькими кластерами через десктопное приложение.
Полезный инструмент для тех, кто работает с Kubernetes и хочет тратить меньше времени на поиск ошибок в логах.
GitHub: https://github.com/kubetail-org/kubetail
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
💡 Размещай бизнес-логику в сервисе с
✅ Один метод сервиса может безопасно вызывать несколько репозиториев в рамках одной транзакции.
✅ Все операции с БД фиксируются вместе при успехе или вместе отменяются при ошибке.
✅ Контроллеры остаются простыми: проверяют входные данные и вызывают нужный сервис.
👉 Java Portal
@Transactional, а не в контроллере.✅ Один метод сервиса может безопасно вызывать несколько репозиториев в рамках одной транзакции.
✅ Все операции с БД фиксируются вместе при успехе или вместе отменяются при ошибке.
✅ Контроллеры остаются простыми: проверяют входные данные и вызывают нужный сервис.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥
✅ 29 октября, четверг, 19:00 (мск) — приходите на митап в Санкт-Петербурге или смотрите трансляцию.
Спикеры из ЮMoney и Сбера выступят с докладами:
🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.
🟣 Как я автоматизировал свой проект — и всё сломал
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.
🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.
Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈
Спикеры из ЮMoney и Сбера выступят с докладами:
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.
Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam
Please open Telegram to view this post
VIEW IN TELEGRAM
В Java Generics не работают с примитивными типами
Обобщения (Generics) в Java работают с ссылочными типами, но не с примитивами.
Дело в том, что Java реализует Generics через type erasure (стирание типов), а
Поэтому Java использует классы-обёртки:
Автоупаковка (autoboxing) позволяет работать с ними почти так же, как с примитивами:
Java автоматически преобразует значения
Главное: Generics работают с объектами, а примитивы в Java объектами не являются.
👉 Java Portal
Обобщения (Generics) в Java работают с ссылочными типами, но не с примитивами.
List<Integer> nums = new ArrayList<>(); // ✅
List<int> nums = new ArrayList<>(); // ❌
Дело в том, что Java реализует Generics через type erasure (стирание типов), а
int, double и boolean — примитивные типы, а не ссылочные.Поэтому Java использует классы-обёртки:
int → Integerdouble → Doubleboolean → BooleanАвтоупаковка (autoboxing) позволяет работать с ними почти так же, как с примитивами:
List<Integer> nums = List.of(1, 2, 3);
Java автоматически преобразует значения
int в объекты Integer.Главное: Generics работают с объектами, а примитивы в Java объектами не являются.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Java Tip: используйте
✅ Безопаснее работа с
✅ Код понятнее и намерения разработчика очевиднее
✅ Меньше риска получить
👉 Java Portal
Optional, чтобы избежать лишних проверок на nullOptional<String> name = Optional.ofNullable(getName());
name.ifPresent(System.out::println);
Optional позволяет явно обозначить, что значение может отсутствовать, и безопасно обработать этот случай.✅ Безопаснее работа с
null✅ Код понятнее и намерения разработчика очевиднее
✅ Меньше риска получить
NullPointerExceptionPlease open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
❤1
💡 Spring Boot Tip: генерируйте Swagger-документацию автоматически с помощью springdoc-openapi
Добавьте
✅ Подключите starter-зависимость — библиотека сама просканирует эндпоинты.
✅ Откройте
✅ Экспортируйте спецификацию OpenAPI в JSON или YAML для клиентов и API-шлюзов.
👉 Java Portal
Добавьте
springdoc-openapi в проект, и библиотека автоматически создаст документацию API на основе ваших контроллеров.✅ Подключите starter-зависимость — библиотека сама просканирует эндпоинты.
✅ Откройте
/swagger-ui.html, чтобы получить интерактивный интерфейс для тестирования API.✅ Экспортируйте спецификацию OpenAPI в JSON или YAML для клиентов и API-шлюзов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Java-баг, который легко пропустить: HashSet больше не находит объект
Ты добавляешь собственный объект в
Как такое возможно?
Предположим, что методы
Сначала добавляем объект в коллекцию:
Затем меняем email:
Если после изменения поля изменился и
Главное правило: не изменяй поля, участвующие в
Иначе объект может физически оставаться в коллекции, но стать практически недоступным для поиска.
👉 Java Portal
Ты добавляешь собственный объект в
HashSet, а затем изменяешь одно из его полей. После этого set.contains(object) возвращает false, хотя объект всё ещё находится внутри коллекции.Как такое возможно?
Предположим, что методы
hashCode() и equals() зависят от email пользователя.Сначала добавляем объект в коллекцию:
user.email = "old@example.com";
set.add(user);
Затем меняем email:
user.email = "new@example.com";
Если после изменения поля изменился и
hashCode(), объект останется в той корзине (bucket), куда его поместили при добавлении. Но при поиске HashSet может обратиться уже к другой корзине — и не найти объект.Главное правило: не изменяй поля, участвующие в
equals() и hashCode(), пока объект находится в хеш-коллекции.Иначе объект может физически оставаться в коллекции, но стать практически недоступным для поиска.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1🤔1
💡 Java Tip: Создаём компактный LRU-кэш без сторонних библиотек
Для реализации простого LRU-кэша в Java можно использовать встроенный
✅
✅ Переопределите
LRU (Least Recently Used) — алгоритм, который удаляет элемент, к которому дольше всего не обращались.
👉 Java Portal
Для реализации простого LRU-кэша в Java можно использовать встроенный
LinkedHashMap.✅
accessOrder = true — перемещает элемент в конец при каждом обращении через get(), поддерживая порядок использования.✅ Переопределите
removeEldestEntry() — чтобы автоматически удалять самый давно неиспользуемый элемент, когда кэш достигает заданного размера.LRU (Least Recently Used) — алгоритм, который удаляет элемент, к которому дольше всего не обращались.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Перестань так использовать Optional в Java
Вместо того чтобы проверять наличие значения через
Используй
Так код становится короче, чище и понятнее.
Помни:
👉 Java Portal
Вместо того чтобы проверять наличие значения через
isPresent() и извлекать его с помощью get():Optional<User> user = repo.findById(id);
if (user.isPresent()) {
return user.get();
}
Используй
orElseThrow():return repo.findById(id)
.orElseThrow(() -> new NotFoundException(id));
Так код становится короче, чище и понятнее.
Помни:
Optional — это тип возвращаемого значения, а не просто навороченная проверка на null.Please open Telegram to view this post
VIEW IN TELEGRAM
❤1