Java Portal | Программирование
12.2K subscribers
1.36K photos
109 videos
42 files
1.38K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Совет по Java 💡: используйте Files.walk() для рекурсивной обработки файлов в директории.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥10👍42
Обход правила WAF в CloudFront, которое блокирует доступ к Spring Boot.

Все обходы возвращают реальные данные Actuator:

GET /%61ctuator/health    → HTTP 200 (5122B) ← 'a' закодирована
GET /a%63tuator/health → HTTP 200 (5123B) ← 'c' закодирована
GET /ac%74uator/health → HTTP 200 (5122B) ← 't' закодирована
GET /act%75ator/health → HTTP 200 (5123B) ← 'u' закодирована
GET /actu%61tor/health → HTTP 200 (5123B) ← 'a' закодирована
GET /actua%74or/health → HTTP 200 (5123B) ← 't' закодирована
GET /actuat%6For/health → HTTP 200 (5123B) ← 'o' закодирована
GET /actuato%72/health → HTTP 200 (5123B) ← 'r' закодирована
GET /a%63%74uator/health → HTTP 200 (5123B) ← двойное кодирование
GET /%61ctua%74or/health → HTTP 200 (5123B) ← двойное кодирование
GET /%61%63%74%75%61%74%6F%72/health → HTTP 200 (5122B) ← полностью закодировано


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Java 26 скоро выходит😁

JDK 26 обновляет HttpClient — добавляет опциональную поддержку HTTP/3 (QUIC), более умную работу с тайм-аутами, загрузку файлов через file-channel, усиленный контроль TLS, а также заголовки и cookies, приведённые в соответствие с RFC.

Подробнее: https://social.ora.cl/6019B6HWIN

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Самый чистый современный паттерн Java для обработки ошибок (без выбрасывания исключений для ожидаемых случаев):

Использовать sealed interface + records + исчерпывающий pattern matching в switch = типобезопасно и контролируется компилятором.

Больше никаких RuntimeException для случаев вроде "not found" / "invalid input" / "unauthorized" — компилятор заставляет обработать каждый возможный результат.

Преимущества в реальном коде:

- Ноль неожиданных исключений во время выполнения
- Понятно, что может произойти, просто посмотрев на сигнатуру метода
- Значительно проще тестировать и рефакторить
- Читается почти как Result в Rust или Result в Kotlin

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6🤔32🤣1
💡Java-совет: если у тебя есть список элементов, и нужно удалить дубликаты и отсортировать их в естественном порядке или с использованием кастомного компаратора, можно использовать TreeSet.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Каков результат работы этой Java-программы?

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Это начало конца проблемы N+1: представили Single Query Loading

Кратко (TL;DR):
Начиная с версии Spring Data JDBC 3.2.0-M2, фреймворк поддерживает Single Query Loading. Single Query Loading позволяет загружать произвольные агрегаты одним SELECT-запросом.

Чтобы включить Single Query Loading, нужно вызвать setSingleQueryLoadingEnabled(true) у вашего RelationalMappingContext.

В версии 3.2.0-M2 это работает только для простых агрегатов, состоящих из корневой сущности (aggregate root) и одной коллекции других сущностей. Также это ограничено методами findAll, findById и findAllByIds в CrudRepository. В будущих версиях эти ограничения будут сняты.

Ещё одно ограничение: используемая база данных должна поддерживать аналитические функции (также известные как window functions). Все официально поддерживаемые базы данных, кроме in-memory решений (H2 и HSQLDB), это поддерживают.

Single Query Loading можно сокращать как SQL, но, пожалуйста, не делайте этого.

Если хотите понять, как это работает и как мы к этому пришли — читайте дальше.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥71
Spring Boot: избегайте FetchType.EAGER, если в этом нет реальной необходимости.

Помечая связь как EAGER, вы говорите ORM загружать её каждый раз при загрузке сущности — независимо от того, вызываете ли вы вообще методы этой связи.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Вот почему базы данных — это сложно.

И именно поэтому с ними так интересно работать.

Хороший бенчмаркинг — особенно мощный инструмент для поиска узких мест в производительности. Я очень часто бенчмаркаю базы данных, но это актуально для любого софта, где важна производительность (а это должен быть вообще любой софт!).

5 правил программирования от Rob Pike

1. Правило 1. Невозможно заранее сказать, где программа будет тратить своё время. Узкие места возникают в неожиданных местах, поэтому не пытайтесь гадать и делать «оптимизации на скорость», пока не доказали, что именно там находится bottleneck.

2. Правило 2. Измеряйте. Не оптимизируйте производительность, пока не провели измерения, и даже после этого не делайте этого, если только одна часть кода явно не доминирует над остальными.

3. Правило 3. Сложные (fancy) алгоритмы работают медленно, когда n маленькое, а n обычно маленькое. У таких алгоритмов большие константы. Пока вы не уверены, что n часто бывает большим, не усложняйте. (Даже если n вырастет, сначала примените правило 2.)

4. Правило 4. Сложные алгоритмы более багованные, чем простые, и их значительно сложнее реализовывать. Используйте простые алгоритмы, а также простые структуры данных.

5. Правило 5. Данные — главное. Если вы выбрали правильные структуры данных и грамотно всё организовали, алгоритмы почти всегда становятся очевидными сами по себе. В программировании центральную роль играют структуры данных, а не алгоритмы.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Совет по Java : вы можете использовать LinkedHashMap, чтобы легко реализовать LRU-кэш (Least Recently Used, «наименее недавно используемый»).

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3
Какие коллекции следует использовать в многопоточной среде в Java?

[1-й вариант]

- через вызов метода Collections.synchronized()
- преобразует обычную коллекцию в синхронизированную
- создаёт обёртку, которая синхронизирует все операции с помощью ключевого слова synchronized

[2-й вариант]

- CopyOnWriteArrayList
- если работа с коллекцией в основном состоит из чтения, это лучший вариант с точки зрения производительности
- потокобезопасность достигается за счёт копирования внутреннего массива при каждом изменении, при этом исходный массив остаётся неизменяемым
- порядок выполнения (visibility/упорядоченность) обеспечивается использованием модификатора volatile для внутреннего массива

[3-й вариант]

- concurrent-коллекции
- неблокирующие хеш-таблицы: ConcurrentSkipListMap, ConcurrentHashMap и ConcurrentSkipListSet (в основе реализации лежит хеш-таблица)
- неблокирующие очереди: ConcurrentLinkedQueue и ConcurrentLinkedDeque
- широкий набор различных блокирующих очередей

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍76
Java 26 вышла. В Java 27 уже планируются обновления безопасности.
JEP 527 добавляет постквантовый гибридный обмен ключами для TLS 1.3 в javax.net.ssl, объединяя ML-KEM с классическим ECDHE.
Конфигурации JSSE по умолчанию получают это обновление автоматически.
Выбор пользовательских групп остаётся простым 👇
3
Я создал шаблонный репозиторий для Claude Code под приложение на Spring Boot — с инструкциями, скиллами и сабагентами 💡

Цель — упростить создание приложения, которое:

- подключается к базе данных
- деплоится в Kubernetes
- запускает тесты с использованием Testcontainers
- и покрывает другие типовые сценарии разработки

https://github.com/piomin/claude-ai-spring-boot

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔41
JavaClaw — версия OpenClaw для Java, созданная на базе Spring Boot, Spring AI и JobRunr: https://javaclaw.io

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: Лучше использовать глобальные фильтры/интерсепторы только для действительно сквозных (cross-cutting) задач и избегать бизнес-логики. Они выполняются для каждого входящего HTTP-запроса.

Некоторые хорошие кейсы использования сквозной функциональности (cross-cutting concerns), реализуемой через фильтры и интерсепторы:

Фильтры (раньше, чем Spring MVC):

- Обработка CORS
- Кодировка (CharacterEncodingFilter)

Интерсепторы (Spring MVC):

- Проверки аутентификации/авторизации
- Замер времени выполнения запроса / метрики
- Обработка локали
- Добавление общих заголовков

Плохой пример:

@Component
public class SubscriptionInterceptor implements HandlerInterceptor {

@Autowired
private UserService userService;

@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {

String userId = request.getHeader("X-USER-ID");

// Бизнес-логика + обращение к БД внутри интерсептора
User user = userService.findById(userId);

if (user.getSubscription().isExpired()) {
response.setStatus(403);
response.getWriter().write("Subscription expired");
return false;
}

return true;
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Тебе больше не нужен Lombok

Records заменяют Data, Value, Getter, Setter, ToString, EqualsAndHashCode. var заменяет val. try-with-resources заменяет Cleanup. Твоя IDE справляется с Builder.

Лучшая зависимость — та, которая тебе не нужна.

Java догнала. Пора обновить подход.

https://loiane.com/2026/03/you-dont-need-lombok-anymore/

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5💊5🤔2
Spring Boot: избегай подключения полного spring-boot-starter-web, если тебе нужен только Spring MVC, потому что этот стартер подтягивает дополнительные компоненты, например встроенный сервер, которые тебе могут быть не нужны.

Instead of importing the full web starter:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

Just set the MVC dependency:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Топ-7 навыков, которые сейчас нужны Java-разработчику, чтобы устроиться на работу:

1. Core Java (8–22)
Streams, records, virtual threads, collections, OOP

2. Spring Boot
REST API, валидация, profiles, AOP, actuator, управление конфигурацией, devtools, кастомные стартеры, обработка ошибок

3. Микросервисы
Feign / WebClient, версионирование API, service discovery, config server, circuit breakers, retries, distributed tracing, API Gateway, SAGA, CQRS

4. Spring Security
JWT, OAuth2, ролевая авторизация

5. Hibernate / JPA
Маппинги, lazy/eager загрузка, JPQL, оптимизация производительности

6. DSA (алгоритмы и структуры данных)
Массивы, деревья, графы, динамическое программирование, хеширование

7. Конкурентность
Thread pools, locks, CompletableFuture, Loom

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥5
Spring Boot: не подключайте полный spring-boot-starter-web, если вам нужен только Spring MVC — этот стартер тянет лишние компоненты, например встроенный сервер, который может быть вам не нужен.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
💊91