Java
16.7K subscribers
1.26K photos
74 videos
2 files
1.12K links
Самая актуальная информация по Java

По всем вопросам- @haarrp

@itchannels_telegram - 🔥лучшие каналы

@pythonl - 🐍

@ai_machinelearning_big_data- ml

@ArtificialIntelligencedl - AI

@datascienceiot - ds

@pythonlbooks 📚

РКН: clck.ru/3FmwKr

#VRHSZ
Download Telegram
Spring Boot 4: как перенести старые настройки

При обновлении добавьте временную зависимость:


runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")


После запуска приложения migrator:

* найдёт устаревшие и переименованные параметры;
* выведет подсказки в логах;
* временно преобразует старые ключи во время выполнения.

Исправьте настройки в application.properties или application.yaml, убедитесь, что предупреждения исчезли, и удалите зависимость. Оставлять её в проекте постоянно не нужно.

#SpringBoot4 #Migration


При обновлении добавьте временную зависимость:


runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")


После запуска приложения migrator:

* найдёт устаревшие и переименованные параметры;
* выведет подсказки в логах;
* временно преобразует старые ключи во время выполнения.

Исправьте настройки в application.properties или application.yaml, убедитесь, что предупреждения исчезли, и удалите зависимость. Оставлять её в проекте постоянно не нужно.

#SpringBoot4 #Migration
👍8❤5🤩2🥰1
Kotlin 2.5.0-Beta1 вышел

JetBrains выпустила первую бета-версию Kotlin 2.5.0.

Главное:

- Language: стабильная name-based destructuring в only-syntax режиме, плюс экспериментальные companion extensions и blocks.
- Standard Library: новые экспериментальные функции для упрощения типичных конструкций с if.
- Kotlin/JS: добавлена поддержка target ES2020.
- Compiler: более предсказуемое поведение inline-функций при компиляции .klib.

Пока это Beta, но релиз уже показывает, в какую сторону движется Kotlin 2.5: меньше синтаксического шума, современнее JS-таргеты и более стабильное поведение компилятора.

https://kotl.in/2-5-0-beta1
🎉5❤3🥰2
⚡️Продвинутый Java-совет: используйте `ClassValue`

Если нужно кешировать метаданные отдельно для каждого класса, не обязательно создавать ConcurrentHashMap<Class<?>, Metadata>.


private static final ClassValue<Metadata> CACHE =
new ClassValue<>() {
@Override
protected Metadata computeValue(Class<?> type) {
return scan(type);
}
};

Metadata metadata = CACHE.get(MyClass.class);


ClassValue лениво вычисляет значение, безопасно работает при конкуренции потоков и хранит отдельный результат для каждого Class. Сбросить кеш можно через remove().

Полезно для reflection, сериализации, мапперов и собственных фреймворков.

#Java #JavaTips #Backend
🔥7❤3🎉3👍1
💡 Java: не создавайте тяжёлые объекты раньше времени

Если объект дорогой в создании, но нужен только в редких сценариях, eager initialization может зря тратить время и память.

Вместо этого используйте lazy initialization:


private HeavyAnalyzer analyzer;

private HeavyAnalyzer analyzer() {
if (analyzer == null) {
analyzer = new HeavyAnalyzer();
}
return analyzer;
}


Так HeavyAnalyzer создастся только при первом реальном обращении.
Где особенно полезно:

- кэши;
- API-клиенты;
- тяжёлая конфигурация;
- анализаторы;
- объекты с дорогой инициализацией.
Для более чистого кода можно использовать Supplier, holder pattern или современные lazy-механизмы Java.

Если доступ идёт из нескольких потоков, простая проверка if (analyzer == null) уже недостаточна - нужна потокобезопасная реализация.
👍7❤3🔥2😱1
⚡️ Spring Boot 4 убрал статус WILL_EXPIRE_SOON: проверьте мониторинг сертификатов

В Spring Boot 3 SSL-компонент health endpoint переходил в особый статус WILL_EXPIRE_SOON, если сертификат скоро истекал. Для проб Kubernetes и балансировщиков это было неудобно: непонятно, считать сервис живым или нет.

В Spring Boot 4 этот статус убрали. Health остаётся UP, а цепочки сертификатов, срок которых скоро закончится, перечисляются в details.expiringChains. Порог предупреждения задаётся свойством management.health.ssl.certificate-validity-warning-threshold:


management:
health:
ssl:
certificate-validity-warning-threshold: 14d
endpoint:
health:
show-details: always


Ответ /actuator/health тогда выглядит так:


{
"status": "UP",
"details": {
"expiringChains": ["server-cert…"]
}
}


Практический вывод простой: пробы больше не будут дёргаться из-за истекающего сертификата, но и алерт по смене статуса тоже не сработает. Если мониторинг ловил WILL_EXPIRE_SOON, переключите его на проверку непустого expiringChains и не забудьте включить show-details, иначе деталей в ответе не будет.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥1😁1
🧠 Spring AI показал, как сделать RAG заметно умнее обычного vector search.

Проблема классического RAG: похожий документ ещё не значит полезный.

Новый пайплайн делает так:

Question → Rewrite → MultiQuery → Vector Search → Jev Filter → Rerank → LLM

Jev проверяет каждый найденный chunk: есть ли там реальный ответ, противоречие или prompt injection.

В демо vector search нашёл 6 фрагментов, но до модели дошли только 2 действительно полезных.

Меньше мусора в контексте → точнее ответы и меньше шансов на prompt injection.

Код и разбор:
https://spring.io/blog/2026/10/02/spring-ai-modular-rag-typesafe-jev/
👍6🔥5❤3
💡 Предпочитайте делегирование наследованию

Связь is-a выглядит удобно: создаём подкласс, наследуем поведение и пишем меньше кода.

Но есть цена.

✅ Подкласс получает весь API родителя.
✅ Он зависит от деталей реализации суперкласса.
✅ Изменение родительского класса может неожиданно сломать потомка.

И чем глубже иерархия, тем сложнее понять, откуда вообще взялось конкретное поведение.

Часто безопаснее композиция:


class OrderService {
private final PaymentService paymentService;
}


Вместо наследования:


class OrderService extends PaymentService {
}


Композиция связывает объекты. Наследование связывает их судьбы.

Если объекту просто нужна чужая функциональность, чаще лучше её делегировать, а не наследовать.
👍5❤4🔥3
🚀 Spring Boot 4: переименовали property для exception translation

Было:

spring.dao.exceptiontranslation.enabled

Стало:

spring.persistence.exceptiontranslation.enabled

Функциональность та же: Spring продолжает переводить persistence-исключения в DataAccessException для @Repository.

Чтобы не пропустить такие изменения при миграции на Boot 4, подключите Spring Boot Properties Migrator — он покажет устаревшие и переименованные настройки.

Мелочь, которая легко ломает конфиг после обновления.
👍6❤1🔥1
💡 Java: почему месяц `5` может оказаться июнем

В Calendar месяцы нумеруются с нуля: январь 0, май 4, июнь 5. Простая ловушка, которая легко превращается в баг.

Начиная с Java 8, для нового кода выбирайте java.time:


LocalDate date = LocalDate.of(2026, 5, 31);
LocalDate deadline = date.plusDays(7);

String text = deadline.format(
DateTimeFormatter.ISO_LOCAL_DATE
);
// 2026-06-07


Здесь 5 означает май, а plusDays() возвращает новый объект, сохраняя исходную дату. Основные типы java.time неизменяемы и безопасны для совместного использования потоками.

Помните: `LocalDateTime` не содержит часового пояса. Для однозначного момента события используйте Instant или задавайте пояс явно.
👍12❤2
💡 Код работает на обычных данных? Проверьте, что происходит на границах.

Баги часто прячутся там, где данных нет, их слишком мало или значение выходит за допустимый диапазон.

✅ `null`: метод корректно обрабатывает отсутствие значения или неожиданно падает с NullPointerException?

✅ Пустая коллекция: что вернёт код, если обрабатывать нечего?

✅ Один элемент: работает ли логика без второго элемента и соседних значений?

✅ Границы: проверьте минимум, максимум и значения сразу за ними. Например, для диапазона 1–100: 0, 1, 100, 101.

Такие тесты ещё и документируют контракт: какие входные данные допустимы, что возвращается и когда ожидается исключение.

Проверяйте не только «всё прошло успешно», но и «что будет, если…».
🤬2❤1🔥1😁1
💡 Описывайте состояния через enum вместо строк

Статусы вроде "pending" и "finished" легко сломать опечаткой. Enum задаёт явный набор состояний и делает код понятнее.

✅ Именованные значения вместо «магических» строк.
✅ Правила допустимых переходов рядом с описанием состояний.
✅ В языках с проверкой полноты switch компилятор подскажет, если вы забыли обработать состояние.

Но enum сам по себе не запрещает неверные переходы. Правило «отменённый заказ нельзя отправить» нужно реализовать отдельно.
👍8❤5🔥1
💡 100% покрытия тестами ≠ код без багов

Coverage показывает, какие строки выполнились во время тестов. Но не доказывает, что результат правильный.

Можно пройти каждую строку и пропустить ошибку в логике, граничный случай или сбой при неожиданном вводе.

✅ Проверяйте результат, а не только выполнение.
✅ Тестируйте рискованные сценарии и обработку ошибок.
✅ Используйте покрытие, чтобы искать пробелы в тестах.

Тест, который ловит реальный баг, ценнее красивой цифры в отчёте.
👍5❤3🔥2
🍃 Не раскладывайте весь Spring-проект по папкам controller, service и repository.

В новом This Week in Spring Джош Лонг советует группировать код по функциональности, используя подход Spring Modulith. Например, orders, payments, users, внутри которых находятся относящиеся к ним слои.

Ещё в подборке:

• JobRunr 9: поиск упавшего шага и задач, вызывающих замедление, остановка выполнения без потери работы.
• Spring AI: разбор агентных паттернов и вызова инструментов от руководителя проекта Кристиана Цолова.
• Progen CLI: видео о генерации каркаса приложения.
• IntelliJ IDEA: обзор новых возможностей.
• A Bootiful Podcast: разговор с создателем Jenkins Косуке Кавагути.

https://spring.io/blog/2026/10/13/this-week-in-spring-october-13th-2026

#Java #SpringBoot
🔥7❤5🎉2
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку

Окружение решает больше, чем кажется.

Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.

AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Хакинг: t.iss.one/linuxkalii
DevOps: t.iss.one/DevOPSitsec
Docker: https://t.iss.one/+90Z5TAyfuNU5YmRi
Golang: t.iss.one/Golang_google
Rust: t.iss.one/rust_code
C++: t.iss.one/cpluspluc
C#: t.iss.one/csharp_ci
Java: t.iss.one/java_library
JavaScript: t.iss.one/javascriptv
React: t.iss.one/react_tg
Frontend: t.iss.one/front
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Мобильная разработка: t.iss.one/mobdevelop
Базы данных: t.iss.one/sqlhub
Data Science: t.iss.one/data_analysis_ml
Big Data: t.iss.one/bigdatai
Математика: t.iss.one/data_math
Физика: t.iss.one/fizmat
Kubernetes: t.iss.one/kubernetc
GameDev: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg

Собеседования и карьера:

DS собеседования: t.iss.one/machinelearning_interview
Python собеседования: t.iss.one/python_job_interview

Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy

Полезное сверху:

ИТ-мемы: t.iss.one/memes_prog
Английский для программистов: t.iss.one/english_forprogrammers
ИИ и технологии: t.iss.one/vistehno
954 ГБ open-source курсов: https://t.iss.one/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy

Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg

Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
❤2👍1🔥1🥰1
Хватит склеивать строки через плюс: как в Java собирать сообщения читаемо

Когда в строку нужно подставить несколько значений, конкатенация быстро превращается в кашу из кавычек и пробелов, где легко потерять пробел или перепутать порядок.


String name = "Ada";
int score = 98;

// трудно читать, когда полей становится больше
String msg = "Player " + name + " scored " + score + " points";

// шаблон отдельно, значения отдельно
String msg2 = String.format("Player %s scored %d points", name, score);

// то же самое короче, Java 15+
String msg3 = "Player %s scored %d points".formatted(name, score);

// для локализации
String i18n = MessageFormat.format("Player {0} scored {1} points", name, score);


В String.format шаблон целиком виден сразу, а поля легко добавить или переставить, не трогая остальную строку. MessageFormat пригодится, когда тексты лежат в ResourceBundle и для разных языков порядок слов меняется: индексы {0} и {1} позволяют переставлять аргументы прямо в переводе.

У MessageFormat есть подвохи. Числа он форматирует по локали, поэтому 1234 превратится в "1,234". А одинарная кавычка там служебный символ, так что "don't" нужно писать как "don''t".

И про производительность: начиная с Java 9 конкатенация через + компилируется в invokedynamic и работает быстро, а String.format заметно медленнее, потому что каждый раз разбирает шаблон. В горячих циклах и логах на каждый запрос лучше оставить плюс или StringBuilder, а format использовать там, где важна читаемость.
👍5❤2🔥2
💡 Все файлы из папки и вложенных каталогов в Java? Используйте `Files.walk()`.

Метод возвращает Stream<Path>, который позволяет рекурсивно обойти дерево каталогов и отфильтровать нужные файлы.

Например, найдём все .java в src:


try (Stream<Path> paths = Files.walk(Path.of("src"))) {
paths.filter(Files::isRegularFile)
.filter(p -> p.getFileName()
.toString()
.endsWith(".java"))
.forEach(System.out::println);
}


✅ Files::isRegularFile исключает каталоги.
✅ В .filter() можно задать любое условие.
✅ try-with-resources закрывает поток и освобождает ресурсы открытых каталогов.

Нюанс: Path.endsWith(".java") не проверяет расширение. Вызывайте endsWith() у строки с именем файла.

При вызове Files.walk() также нужно обработать IOException или объявить его в throws.
👍5🔥1
😁23
Java-приложение ускорили примерно на 10% одним флагом JVM

Автор alf.io - сервиса продажи билетов на Spring Boot и PostgreSQL- решил проверить, стоит ли переходить на JDK 27 ради Compact Object Headers. В итоге протестировал и заголовки объектов, и сборщики мусора, и AOT-кеш.

Компактные заголовки уменьшают служебную часть объекта с 12 до 8 байт. Для приложения с множеством небольших объектов это означает меньше занятого места и работы для GC.

В контейнере с 2 CPU и 512 МБ памяти результаты оказались такими:

- Компактные заголовки снизили затраты CPU на GC и задержку p95 примерно на 10%.
- AOT-кеш Leyden сократил время запуска с 7,1 до 5,4 секунды относительно JDK 25 с рабочим AppCDS.
- ParallelGC снизил потребление CPU примерно на треть, но увеличил паузы сборки мусора.

За выигрышем от компактных заголовков необязательно идти на JDK 27. В JDK 25 их можно включить явно:


java -XX:+UseCompactObjectHeaders -jar app.jar


При этом потребление памяти контейнером не уменьшилось: при фиксированном размере кучи экономия проявилась в меньшей нагрузке на GC и более быстрых ответах.

Это результаты одного приложения — полезный повод провести свой замер.

https://ticketguy.dev/blogs/2026-10-17-jdk27-memory/
❤5🔥3👍2
Критическая уязвимость в Java: атака по сети без пароля и участия пользователя

Oracle опубликовала предупреждение CVE-2026-91403 с оценкой CVSS 9.1. Проблема находится в JSSE — компоненте Java, который обеспечивает защищённые соединения TLS.

По описанию Oracle, успешная атака может позволить читать, изменять и удалять данные, доступные уязвимому приложению. Для эксплуатации не нужны учётные данные, а сложность атаки оценена как низкая.

В списке затронутых версий:

- Java SE 8u511 / 8u511-perf, 11.0.33, 17.0.21, 21.0.13, 25.0.5 и 27.0.1.
- Oracle GraalVM for JDK 17.0.21 и 21.0.13.
- Oracle GraalVM Enterprise Edition 21.3.20.

Условия зависят от приложения: Oracle указывает на сценарии, где данные атакующего попадают в API уязвимого компонента, например через веб-сервис. Само наличие Java ещё не означает, что любой сервис можно атаковать.

Администраторам стоит проверить используемые сборки Java, включая runtime внутри контейнеров, и установить исправления по инструкции поставщика.

Предупреждение опубликовано 21 октября. Более ранние версии тоже могут быть затронуты — отсутствие в списке не подтверждает их безопасность.

https://www.oracle.com/security-alerts/alert-cve-2026-91403.html
👍11❤2🎉2
💡 Spring Boot 4: DevTools больше не запускает LiveReload по умолчанию

Автоматический перезапуск приложения при изменениях в classpath продолжает работать. А обновление страницы в браузере через LiveReload теперь нужно включать явно.

В application.properties:


spring.devtools.livereload.enabled=true


Удобно, если запускаете несколько приложений на одной машине: ненужные LiveReload-серверы больше не пытаются занять общий порт.

Учтите: начиная со Spring Boot 4.1, LiveReload объявлен устаревшим без замены.
❤4👍2🔥1