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

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Java tip: используйте ThreadLocal.withInitial(...), чтобы у каждого потока было свое безопасное значение по умолчанию.

Значение создается лениво

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍4
Вопрос на Java-собеседовании:

Что такое Spring Bean Scope?

Spring Bean Scope определяет жизненный цикл и область видимости бина в контейнере.

Основные типы:

- singleton (по умолчанию) — один экземпляр на весь контейнер.
- prototype — новый экземпляр для каждого запроса.
- request — бин живет в рамках одного HTTP-запроса.
- session — бин живет в рамках одной HTTP-сессии.
- application — бин живет в рамках всего веб-приложения.
- websocket — бин живет на протяжении сессии WebSocket.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍4
Гайд для новичков по созданию HTTP-сервера с нуля.

Хочешь своими руками написать HTTP-сервер и потом отправлять на него запросы и получать ответы?
Если да, вот как раз гайд, по которому можно пройтись.

Что нужно знать заранее

Нужно знать Java.
Если не знаешь, не страшно: шаги из гайда можно перенести почти на любой язык, с которым тебе удобно работать, просто используя семантически эквивалентные конструкции в коде.

Примечание: JS/TS для этого гайда я бы не рекомендовал.


Базовое понимание программирования и OOP.

Текстовый редактор и, возможно, много кофе. Как пойдет. 🤭

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java: List.reversed() возвращает неизменяемое (unmodifiable) представление исходного списка в обратном порядке.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
This media is not supported in your browser
VIEW IN TELEGRAM
Трюк, чтобы сэкономить место на диске и время при клонировании репозиториев из GitHub.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Совет по Java : не полагайся полностью на сборщик мусора — утечки памяти всё ещё возможны.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥2
Типы классов в Java:

1. Concrete Class (конкретный класс) — обычный класс с полной реализацией методов.

2. Abstract Class (абстрактный класс) — не может быть создан через new; может содержать абстрактные методы.

3. Final Class (финальный класс) — не может быть унаследован.

4. Static Class (вложенный статический класс) — статический внутренний класс внутри другого класса.

5. Inner Class (внутренний класс) — нестатический класс, объявленный внутри другого класса.

6. Local Class (локальный класс) — класс, определённый внутри метода.

7. Anonymous Class (анонимный класс) — класс без имени, обычно используется для кратковременных реализаций.

8. Singleton Class (синглтон-класс) — гарантирует существование только одного экземпляра класса.

9. POJO (Plain Old Java Object) — простой Java-класс без специальных ограничений или требований.

10. Record Class (Java 14+) — компактный класс для представления неизменяемых данных.

11. Enum Class (класс-перечисление) — определяет фиксированный набор констант.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92🤔1
💡Java tip: Начиная с Java 14 можно использовать switch-выражения, чтобы писать более короткую и чистую мультиветвящуюся логику.

// Old way:
String season;
switch (month) {
case 12:
case 1:
case 2:
season = "Winter";
break;
case 3:
case 4:
case 5:
season = "Spring";
break;
default:
season = "Invalid";
}

// New switch expression:
String season = switch (month) {
case 12, 1, 2 -> "Winter";
case 3, 4, 5 -> "Spring";
default -> "Invalid";
};
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥85👍3👀1
Совет по Spring AI

Запускаете локальные AI-модели через LM Studio и сталкиваетесь с зависанием соединения, когда ваше приложение Spring AI вызывает API, совместимый с OpenAI?

LM Studio не поддерживает HTTP/2, из-за чего запрос может зависать.

Решение: отключить HTTP/2 для`RestClient`.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Spring Boot: Используйте spring.mvc.publish-request-params=true только в dev-среде. Это опасно в production.

В production логирование деталей запроса может привести к раскрытию чувствительной информации.

Когда вы настраиваете свойства Spring-приложения в dev со следующими параметрами:

# Включить публикацию параметров
spring.mvc.publish-request-params=true

# Установить уровни логирования, чтобы видеть вывод
logging.level.org.springframework.web=DEBUG
logging.level.org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor=DEBUG


и конфигурацию фильтра примерно такую:

@Bean
public CommonsRequestLoggingFilter logFilter() {
CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
filter.setIncludeQueryString(true); // 2) Query-параметры
filter.setIncludeHeaders(true); // 1) Заголовки запроса
filter.setIncludePayload(true); // 3) Данные формы
filter.setMaxPayloadLength(1000);
filter.setAfterMessagePrefix("COMPLETE REQUEST: ");
return filter;
}


вы включаете логирование:

1. заголовков запроса (Request headers)
2. query-параметров (Query parameters)
3. данных формы (Form data)

Без этого Spring маскирует или опускает многие из этих деталей, чтобы избежать утечки информации.

Не используйте это в production, иначе вы раскроете чувствительную информацию, например пароли:

POST /login
Body: {"username":"john","password":"mypassword"}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42
Вопрос на собеседовании по Git:

Ваша основная ветка (main) опережает вашу локальную ветку.

Как обновить свою ветку, не затронув ваши коммиты?

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

git rebase origin/main
Перенакладывает (reapply) ваши коммиты поверх обновлённой ветки main, сохраняя чистую историю коммитов.

До rebase:

A --- B --- C  (origin/main)
\
D --- E (ваша ветка)


После rebase:

A --- B --- C --- D --- E


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143🤔1
Совет по 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