Java tip: используйте
Значение создается лениво
👉 Java Portal
ThreadLocal.withInitial(...), чтобы у каждого потока было свое безопасное значение по умолчанию.Значение создается лениво
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4
Вопрос на Java-собеседовании:
Что такое Spring Bean Scope?
Основные типы:
- singleton (по умолчанию) — один экземпляр на весь контейнер.
- prototype — новый экземпляр для каждого запроса.
- request — бин живет в рамках одного HTTP-запроса.
- session — бин живет в рамках одной HTTP-сессии.
- application — бин живет в рамках всего веб-приложения.
- websocket — бин живет на протяжении сессии WebSocket.
👉 Java Portal
Что такое Spring Bean Scope?
Spring Bean Scope определяет жизненный цикл и область видимости бина в контейнере.Основные типы:
- singleton (по умолчанию) — один экземпляр на весь контейнер.
- prototype — новый экземпляр для каждого запроса.
- request — бин живет в рамках одного HTTP-запроса.
- session — бин живет в рамках одной HTTP-сессии.
- application — бин живет в рамках всего веб-приложения.
- websocket — бин живет на протяжении сессии WebSocket.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4
Гайд для новичков по созданию HTTP-сервера с нуля.
Хочешь своими руками написать HTTP-сервер и потом отправлять на него запросы и получать ответы?
Если да, вот как раз гайд, по которому можно пройтись.
Что нужно знать заранее
Нужно знать Java.
Если не знаешь, не страшно: шаги из гайда можно перенести почти на любой язык, с которым тебе удобно работать, просто используя семантически эквивалентные конструкции в коде.
Базовое понимание программирования и OOP.
Текстовый редактор и, возможно, много кофе. Как пойдет.🤭
👉 Java Portal
Хочешь своими руками написать HTTP-сервер и потом отправлять на него запросы и получать ответы?
Если да, вот как раз гайд, по которому можно пройтись.
Что нужно знать заранее
Нужно знать Java.
Если не знаешь, не страшно: шаги из гайда можно перенести почти на любой язык, с которым тебе удобно работать, просто используя семантически эквивалентные конструкции в коде.
Примечание: JS/TS для этого гайда я бы не рекомендовал.
Базовое понимание программирования и OOP.
Текстовый редактор и, возможно, много кофе. Как пойдет.
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java:
👉 Java Portal
List.reversed() возвращает неизменяемое (unmodifiable) представление исходного списка в обратном порядке.Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
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 (абстрактный класс) — не может быть создан через
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
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 (класс-перечисление) — определяет фиксированный набор констант.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🤔1
// 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
🔥8❤5👍3👀1
Совет по Spring AI
Запускаете локальные AI-модели через LM Studio и сталкиваетесь с зависанием соединения, когда ваше приложение Spring AI вызывает API, совместимый с OpenAI?
LM Studio не поддерживает HTTP/2, из-за чего запрос может зависать.
Решение: отключить HTTP/2 для`RestClient`.
👉 Java Portal
Запускаете локальные AI-модели через LM Studio и сталкиваетесь с зависанием соединения, когда ваше приложение Spring AI вызывает API, совместимый с OpenAI?
LM Studio не поддерживает HTTP/2, из-за чего запрос может зависать.
Решение: отключить HTTP/2 для`RestClient`.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Spring Boot: Используйте
В production логирование деталей запроса может привести к раскрытию чувствительной информации.
Когда вы настраиваете свойства Spring-приложения в dev со следующими параметрами:
и конфигурацию фильтра примерно такую:
вы включаете логирование:
1. заголовков запроса (Request headers)
2. query-параметров (Query parameters)
3. данных формы (Form data)
Без этого Spring маскирует или опускает многие из этих деталей, чтобы избежать утечки информации.
Не используйте это в production, иначе вы раскроете чувствительную информацию, например пароли:
👉 Java Portal
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"}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤2
Вопрос на собеседовании по Git:
Ваша основная ветка (main) опережает вашу локальную ветку.
Как обновить свою ветку, не затронув ваши коммиты?
git fetch
Скачивает последние изменения из удалённого репозитория, не изменяя ваши локальные коммиты.
git rebase origin/main
Перенакладывает (reapply) ваши коммиты поверх обновлённой ветки main, сохраняя чистую историю коммитов.
До rebase:
После rebase:
👉 Java Portal
Ваша основная ветка (main) опережает вашу локальную ветку.
Как обновить свою ветку, не затронув ваши коммиты?
git fetch
Скачивает последние изменения из удалённого репозитория, не изменяя ваши локальные коммиты.
git rebase origin/main
Перенакладывает (reapply) ваши коммиты поверх обновлённой ветки main, сохраняя чистую историю коммитов.
До rebase:
A --- B --- C (origin/main)
\
D --- E (ваша ветка)
После rebase:
A --- B --- C --- D --- E
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
👍14❤3🤔1
Совет по Java 💡 : используйте
👉 Java Portal
Files.walk() для рекурсивной обработки файлов в директории.Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥10👍4❤2
Обход правила WAF в CloudFront, которое блокирует доступ к Spring Boot.
Все обходы возвращают реальные данные Actuator:
👉 Java Portal
Все обходы возвращают реальные данные 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) ← полностью закодировано
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Java 26 скоро выходит😁
JDK 26 обновляет
Подробнее: https://social.ora.cl/6019B6HWIN
👉 Java Portal
JDK 26 обновляет
HttpClient — добавляет опциональную поддержку HTTP/3 (QUIC), более умную работу с тайм-аутами, загрузку файлов через file-channel, усиленный контроль TLS, а также заголовки и cookies, приведённые в соответствие с RFC.Подробнее: https://social.ora.cl/6019B6HWIN
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Самый чистый современный паттерн Java для обработки ошибок (без выбрасывания исключений для ожидаемых случаев):
Использовать sealed interface + records + исчерпывающий pattern matching в switch = типобезопасно и контролируется компилятором.
Больше никаких
Преимущества в реальном коде:
- Ноль неожиданных исключений во время выполнения
- Понятно, что может произойти, просто посмотрев на сигнатуру метода
- Значительно проще тестировать и рефакторить
- Читается почти как
👉 Java Portal
Использовать sealed interface + records + исчерпывающий pattern matching в switch = типобезопасно и контролируется компилятором.
Больше никаких
RuntimeException для случаев вроде "not found" / "invalid input" / "unauthorized" — компилятор заставляет обработать каждый возможный результат.Преимущества в реальном коде:
- Ноль неожиданных исключений во время выполнения
- Понятно, что может произойти, просто посмотрев на сигнатуру метода
- Значительно проще тестировать и рефакторить
- Читается почти как
Result в Rust или Result в KotlinPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥6🤔3❤2🤣1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
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, нужно вызвать
В версии 3.2.0-M2 это работает только для простых агрегатов, состоящих из корневой сущности (aggregate root) и одной коллекции других сущностей. Также это ограничено методами
Ещё одно ограничение: используемая база данных должна поддерживать аналитические функции (также известные как window functions). Все официально поддерживаемые базы данных, кроме in-memory решений (H2 и HSQLDB), это поддерживают.
Single Query Loading можно сокращать как SQL, но, пожалуйста, не делайте этого.
Если хотите понять, как это работает и как мы к этому пришли — читайте дальше.
👉 Java Portal
Кратко (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, но, пожалуйста, не делайте этого.
Если хотите понять, как это работает и как мы к этому пришли — читайте дальше.
Please open Telegram to view this post
VIEW IN TELEGRAM
This is the Beginning of the End of the N+1 Problem: Introducing Single Query Loading.
Level up your Java code and explore what Spring can do for you.
🔥7❤1
Spring Boot: избегайте
Помечая связь как
👉 Java Portal
FetchType.EAGER, если в этом нет реальной необходимости.Помечая связь как
EAGER, вы говорите ORM загружать её каждый раз при загрузке сущности — независимо от того, вызываете ли вы вообще методы этой связи.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Вот почему базы данных — это сложно.
И именно поэтому с ними так интересно работать.
Хороший бенчмаркинг — особенно мощный инструмент для поиска узких мест в производительности. Я очень часто бенчмаркаю базы данных, но это актуально для любого софта, где важна производительность (а это должен быть вообще любой софт!).
5 правил программирования от Rob Pike
1. Правило 1. Невозможно заранее сказать, где программа будет тратить своё время. Узкие места возникают в неожиданных местах, поэтому не пытайтесь гадать и делать «оптимизации на скорость», пока не доказали, что именно там находится bottleneck.
2. Правило 2. Измеряйте. Не оптимизируйте производительность, пока не провели измерения, и даже после этого не делайте этого, если только одна часть кода явно не доминирует над остальными.
3. Правило 3. Сложные (fancy) алгоритмы работают медленно, когда n маленькое, а n обычно маленькое. У таких алгоритмов большие константы. Пока вы не уверены, что n часто бывает большим, не усложняйте. (Даже если n вырастет, сначала примените правило 2.)
4. Правило 4. Сложные алгоритмы более багованные, чем простые, и их значительно сложнее реализовывать. Используйте простые алгоритмы, а также простые структуры данных.
5. Правило 5. Данные — главное. Если вы выбрали правильные структуры данных и грамотно всё организовали, алгоритмы почти всегда становятся очевидными сами по себе. В программировании центральную роль играют структуры данных, а не алгоритмы.
👉 Java Portal
И именно поэтому с ними так интересно работать.
Хороший бенчмаркинг — особенно мощный инструмент для поиска узких мест в производительности. Я очень часто бенчмаркаю базы данных, но это актуально для любого софта, где важна производительность (а это должен быть вообще любой софт!).
5 правил программирования от Rob Pike
1. Правило 1. Невозможно заранее сказать, где программа будет тратить своё время. Узкие места возникают в неожиданных местах, поэтому не пытайтесь гадать и делать «оптимизации на скорость», пока не доказали, что именно там находится bottleneck.
2. Правило 2. Измеряйте. Не оптимизируйте производительность, пока не провели измерения, и даже после этого не делайте этого, если только одна часть кода явно не доминирует над остальными.
3. Правило 3. Сложные (fancy) алгоритмы работают медленно, когда n маленькое, а n обычно маленькое. У таких алгоритмов большие константы. Пока вы не уверены, что n часто бывает большим, не усложняйте. (Даже если n вырастет, сначала примените правило 2.)
4. Правило 4. Сложные алгоритмы более багованные, чем простые, и их значительно сложнее реализовывать. Используйте простые алгоритмы, а также простые структуры данных.
5. Правило 5. Данные — главное. Если вы выбрали правильные структуры данных и грамотно всё организовали, алгоритмы почти всегда становятся очевидными сами по себе. В программировании центральную роль играют структуры данных, а не алгоритмы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5