Java: Очень интересная библиотека под названием Sift заменяет криптичный, основанный на строках подход движка Java Regex на fluent API.
https://github.com/Mirkoddd/Sift
👉 Java Portal
// ПРИМЕР БАЗОВОГО ИСПОЛЬЗОВАНИЯ: паттерн hexColor ^#[0-9a-fA-F]{6}$
// Вы можете задать вышеуказанный паттерн более выразительным способом,
// используя DSL (domain-specific language) Sift
String hexColor = Sift.fromStart()
.character('#')
.then()
.exactly(6)
.hexDigits()
.andNothingElse()
.shake();
// Если вы используете Maven, чтобы скомпилировать приведённый выше пример,
// достаточно добавить следующую зависимость:
<!-- Core engine — без внешних зависимостей -->
<dependency>
<groupId>com.mirkoddd</groupId>
<artifactId>sift-core</artifactId>
<version>6.4.0</version>
</dependency>https://github.com/Mirkoddd/Sift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Совет по Java Spring Boot: используйте
Если API отвечает с ошибками или падает, вам не нужно вручную писать циклы с повторными попытками.
Аннотация
- автоматически повторять вызовы при возникновении определённых исключений
- управлять количеством попыток
- настраивать задержку и экспоненциальный backoff
- выполнять fallback через
Например, на картинке:
- выполняется 3 попытки при указанных исключениях
- стартовая задержка — 2 секунды, далее она удваивается при каждой попытке
- вызывается
Это удобно, читаемо и избавляет от boilerplate-кода при интеграции с внешними API.
👉 Java Portal
@Retryable для обработки нестабильных внешних сервисов.Если API отвечает с ошибками или падает, вам не нужно вручную писать циклы с повторными попытками.
Аннотация
@Retryable позволяет:- автоматически повторять вызовы при возникновении определённых исключений
- управлять количеством попыток
- настраивать задержку и экспоненциальный backoff
- выполнять fallback через
@Recover, если всё равно не удалосьНапример, на картинке:
- выполняется 3 попытки при указанных исключениях
- стартовая задержка — 2 секунды, далее она удваивается при каждой попытке
- вызывается
recover(), если все попытки исчерпаныЭто удобно, читаемо и избавляет от boilerplate-кода при интеграции с внешними API.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Честно говоря, это самая точная диаграмма, которую я видел.
Waterfall: планируешь 18 месяцев и в итоге доставляешь именно то, что уже никому не нужно.
Agile: на каждом этапе поставляешь что-то пригодное к использованию, но CEO постоянно спрашивает: «Где машина?»
AI: ты получаешь машину в первый же день. У неё шесть колёс, двери установлены задом наперёд, и есть ракетная установка. Ты тратишь больше времени не на «разработку», а на адаптацию под себя, контроль и валидацию. Это и делают сейчас лучшие AI-разработчики. Они не строят. Они формируют и берут ответственность.
👉 Java Portal
Waterfall: планируешь 18 месяцев и в итоге доставляешь именно то, что уже никому не нужно.
Agile: на каждом этапе поставляешь что-то пригодное к использованию, но CEO постоянно спрашивает: «Где машина?»
AI: ты получаешь машину в первый же день. У неё шесть колёс, двери установлены задом наперёд, и есть ракетная установка. Ты тратишь больше времени не на «разработку», а на адаптацию под себя, контроль и валидацию. Это и делают сейчас лучшие AI-разработчики. Они не строят. Они формируют и берут ответственность.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
Spring Boot: используйте TaskScheduler для реализации лёгких динамических задач. Для более сложных сценариев стоит рассмотреть Quartz.
✅ Инжектим и используем:
Внедрённый бин — это ThreadPoolTaskScheduler, встроенная реализация как TaskScheduler, так и ScheduledExecutorService.
✅ При необходимости можно настроить его конфигурацию:
👉 Java Portal
...
@Autowired
TaskScheduler scheduler;
scheduler.schedule(
() -> System.out.println("Hello!"),
new CronTrigger("0 */5 * * * *") // каждые 5 минут
);
...
Внедрённый бин — это ThreadPoolTaskScheduler, встроенная реализация как TaskScheduler, так и ScheduledExecutorService.
@Configuration
@EnableScheduling
public class SchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("my-scheduler-");
scheduler.initialize();
return scheduler;
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Полезняшка: парень сделал небольшой плагин для IntelliJ IDEA для вещи, которая раздражала многих годами:
https://github.com/saket/intellij-comment-continuation
Плагин для IntelliJ IDEA, который продолжает
👉 Java Portal
https://github.com/saket/intellij-comment-continuation
Плагин для IntelliJ IDEA, который продолжает
// комментарии на следующей строке при нажатии Enter с сохранением отступа. Повторное нажатие Enter на пустой строке комментария завершает блок комментариев и сохраняет тот же уровень отступа.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥5
Один из самых ценных паттернов в Java на продакшене: неизменяемые DTO с использованием Records + Builder.
В реальных Java-приложениях (Spring Boot API, микросервисы, event-системы) мы создаем сотни DTO.
Лучший современный паттерн в 2026 году:
Records (неизменяемые по умолчанию) + паттерн Builder для гибкой инициализации.
Преимущества:
- Неизменяемость → потокобезопасность и предсказуемость
- Нет boilerplate-кода с геттерами/сеттерами
- Builder дает удобный fluent API для опциональных полей
- Отличная интеграция с Jackson, валидацией и MapStruct
Реалистичный пример из продакшена ниже:
👉 Java Portal
В реальных Java-приложениях (Spring Boot API, микросервисы, event-системы) мы создаем сотни DTO.
Лучший современный паттерн в 2026 году:
Records (неизменяемые по умолчанию) + паттерн Builder для гибкой инициализации.
Преимущества:
- Неизменяемость → потокобезопасность и предсказуемость
- Нет boilerplate-кода с геттерами/сеттерами
- Builder дает удобный fluent API для опциональных полей
- Отличная интеграция с Jackson, валидацией и MapStruct
Реалистичный пример из продакшена ниже:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Продвинутый совет по Spring
Превратите структуру вашего Spring-проекта в тестируемый контракт, который никогда не будет незаметно деградировать.
С помощью Taikai вы можете принудительно проверять архитектурные ограничения с использованием предопределённых правил ArchUnit, см. документацию.
https://github.com/enofex/taikai
👉 Java Portal
Превратите структуру вашего Spring-проекта в тестируемый контракт, который никогда не будет незаметно деградировать.
С помощью Taikai вы можете принудительно проверять архитектурные ограничения с использованием предопределённых правил ArchUnit, см. документацию.
https://github.com/enofex/taikai
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Совет по Java: избегайте накладных расходов на boxing, используя потоки примитивов.
❌ Создание объектов Integer для каждого значения:
✅ Работа напрямую с int:
✅ Другие классы потоков примитивов:
👉 Java Portal
Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);
int sumBoxed = boxed.reduce(0, Integer::sum);
int sumPrimitive = IntStream.of(1, 2, 3, 4, 5).sum();
LongStream, DoubleStream
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Spring Boot — большой фреймворк, на освоение которого могут уйти годы. Но, на мой взгляд, достаточно знать ключевые возможности и иметь практический опыт с наиболее часто используемыми фичами, чтобы считаться “готовым к работе”.
Roadmap для начинающих по Spring Boot : читать
👉 Java Portal
Roadmap для начинающих по Spring Boot : читать
Please open Telegram to view this post
VIEW IN TELEGRAM
Reddit
From the springboot_learners community on Reddit
Explore this post and more from the springboot_learners community
❤3
Совет по Java: начиная с Java 15 можно использовать
Работает как
Вместо:
Можно написать:
Также хорошо работает с многострочным форматированием:
👉 Java Portal
String.formatted(...) для форматирования строк вместо String.format(...).Работает как
String.format, но выглядит немного чище и понятнее:Вместо:
String message = String.format("Hello %s, you have %d messages", user, count);
System.out.println(String.format("Hello %s, you have %d messages", user, count));Можно написать:
String message = "Hello %s, you have %d messages".formatted(user, count);
System.out.println("Hello %s, you have %d messages".formatted(user, count));
Также хорошо работает с многострочным форматированием:
String json = """
{
"user": "%s",
"messages": %d
}
""".formatted(user, count);
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍5🔥4
Java Spring Boot: Не допускайте эту ошибку с фильтрами/интерцепторами
Многие используют фильтры и интерцепторы неправильно
Они должны использоваться только для сквозных задач
(то есть для того, что применяется ко ВСЕМ запросам)
Примеры корректного использования:
[Фильтры]:
- CORS
- Кодировка
[Интерцепторы]:
- Аутентификация/Авторизация
- Метрики/Логирование
- Локаль
- Общие заголовки
[Основная ошибка]:
размещать там бизнес-логику
Например:
- выполнение запросов к базе данных
- проверка подписок
- сложная логика
Почему это плохо:
- выполняется для КАЖДОГО запроса
- создаёт дополнительную нагрузку
- нарушает архитектуру
- усложняет тестирование
Вывод:
- интерцептор превращается в «мусорный слой»
Как делать правильно:
- бизнес-логика → в сервисах
- контроллеры → оркестрация
👉 Java Portal
Многие используют фильтры и интерцепторы неправильно
Они должны использоваться только для сквозных задач
(то есть для того, что применяется ко ВСЕМ запросам)
Примеры корректного использования:
[Фильтры]:
- CORS
- Кодировка
[Интерцепторы]:
- Аутентификация/Авторизация
- Метрики/Логирование
- Локаль
- Общие заголовки
[Основная ошибка]:
размещать там бизнес-логику
Например:
- выполнение запросов к базе данных
- проверка подписок
- сложная логика
Почему это плохо:
- выполняется для КАЖДОГО запроса
- создаёт дополнительную нагрузку
- нарушает архитектуру
- усложняет тестирование
Вывод:
- интерцептор превращается в «мусорный слой»
Как делать правильно:
- бизнес-логика → в сервисах
- контроллеры → оркестрация
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
Совет по Java : Если нужно посчитать количество вхождений элемента в списке, можно использовать
#Java #Collections
👉 Java Portal
Collections.frequency(...).#Java #Collections
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3
Большинство проектов на Spring Boot обрабатывают конфигурацию одинаково: плоские классы с
В Apereo CAS — более 1000 свойств в 633 конфигурационных классах. Автор написал статью о том, как система конфигурации остаётся навигируемой при таком масштабе:
https://medium.com/all-things-software/spring-boot-configuration-properties-at-scale-884f494721ac
👉 Java Portal
@ConfigurationProperties, строковые имена свойств и надежда на то, что все прочитают README.В Apereo CAS — более 1000 свойств в 633 конфигурационных классах. Автор написал статью о том, как система конфигурации остаётся навигируемой при таком масштабе:
https://medium.com/all-things-software/spring-boot-configuration-properties-at-scale-884f494721ac
Please open Telegram to view this post
VIEW IN TELEGRAM
Medium
Spring Boot Configuration Properties at Scale
Apereo CAS manages 1,000+ settings across 633 classes using standard Spring Boot patterns. Here’s what your project can steal.
❤3
Java 21 открывает новую эпоху конкурентности с виртуальными потоками — лёгкими потоками, управляемыми JVM, которые значительно повышают производительность I/O-bound приложений.
Подробнее - https://lttr.ai/Ap1Np
#Java #MongoDB #VirtualThread
👉 Java Portal
Подробнее - https://lttr.ai/Ap1Np
#Java #MongoDB #VirtualThread
Please open Telegram to view this post
VIEW IN TELEGRAM
DEV Community
Java Virtual Threads in Action: Optimizing MongoDB Operation
This article was written by Otavio Santana, a renowned contributor to the Java and open-source...
❤2
Spring Boot: можно валидировать конфигурационные классы с помощью аннотации
✅ Это позволяет приложению падать на старте (fail fast), если конфигурация некорректна.
#SpringBoot #JavaDev
👉 Java Portal
@Validated.@Validated
@ConfigurationProperties(prefix = "app")
public class AppProperties {
@NotBlank
private String name;
@Min(1)
@Max(60)
private int timeout;
// getters/setters
}
#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3
#Java Совет: вы можете откатить транзакцию БД, созданную аннотацией
👉 Java Portal
@Transactional, получив текущий TransactionStatus через класс TransactionAspectSupport и установив для него rollback через setRollbackOnly();. Таким образом, не нужно выбрасывать исключение.Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2🔥1🤣1
Spring Boot: лучше избегать логирования внутри плотных циклов, так как это может повлиять на производительность приложения и привести к засорению лог-файлов.
Пример:
Если
Если логировать всё же нужно, лучше использовать уровень
Также можно добавить проверку, если требуется выполнить нетривиальные вычисления:
👉 Java Portal
Пример:
for (Order order : orders) {
log.info("Order {}", order.getId());
process(order);
}Если
orders большой, это может замедлить обработку и засорить лог-файлы.Если логировать всё же нужно, лучше использовать уровень
debug:log.debug("Order: {}", order.getId());Также можно добавить проверку, если требуется выполнить нетривиальные вычисления:
if (log.isDebugEnabled()) {
log.debug("Order: {}", expensiveElaboration());
}Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
👍5❤4
Java API Tip
Безопасное приведение
Используй
Без него преобразование произойдёт молча — и ты можешь получить некорректный результат без всяких ошибок.
Используй
👉 Java Portal
Безопасное приведение
long к intИспользуй
Math.toIntExact() — этот метод возвращает значение long, но выбрасывает ArithmeticException, если оно не помещается в intБез него преобразование произойдёт молча — и ты можешь получить некорректный результат без всяких ошибок.
Используй
toIntExact, когда важно контролировать переполнениеPlease open Telegram to view this post
VIEW IN TELEGRAM
❤8
@RestController вместо @Controller + @ResponseBody@RestController — это мета-аннотация, которая включает @ResponseBody, и затем автоматически применяется ко всем методам:@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}
@Controller и @ResponseBody:@Controller
public class MyController {
@ResponseBody
@GetMapping("/hello")
public String hello() {
return "Hello!";
}
}
@RestController:@RestController
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello!";
}
}
#SpringBoot #CleanCode
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7