🔥 Field vs Constructor Injection: зомби-объекты в production
Казалось бы, избитая тема. Но копните глубже @Autowired — и обнаружите, что ваши объекты после new существуют в состоянии "клинической смерти".
Автор разбирает не "удобство тестов" (это мелочи), а фундаментальные проблемы: нарушение контракта конструктора, проблемы с JMM, хрупкость при AOT-компиляции для GraalVM, race conditions в мультипоточке.
Рекомендую прочитать, если хотите понять почему Spring Framework 6 окончательно выбрал constructor injection, а не просто "так все делают".
🔗 Читайте подробнее
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#coreJava
Казалось бы, избитая тема. Но копните глубже @Autowired — и обнаружите, что ваши объекты после new существуют в состоянии "клинической смерти".
Автор разбирает не "удобство тестов" (это мелочи), а фундаментальные проблемы: нарушение контракта конструктора, проблемы с JMM, хрупкость при AOT-компиляции для GraalVM, race conditions в мультипоточке.
Рекомендую прочитать, если хотите понять почему Spring Framework 6 окончательно выбрал constructor injection, а не просто "так все делают".
══════ Навигация ══════
Вакансии • Задачи • Собесы
#coreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5👏2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁20🤡12🔥2
Backend Engineer (Java/Kotlin) — от 600 до 3 500 $ — офис (Минск)
Middle Java-разработчик — 240 000 - 260 000₽ — удалёнка
Java Developer — от 5 000 $ — удалёнка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3👏1
«Этот манёвр будет стоить нам 51 год...»
— или 20% от вашего бюджета на самообразование. В Java-мире архитектурные паттерны и алгоритмы — это то, что отличает мидла от сеньора. Не ждите особого случая, забирайте базу прямо сейчас.
Успейте купить курсы Proglib Academy по старой цене до понедельника:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Взять по старой цене
⚠️ Цены вырастут 19 января
— или 20% от вашего бюджета на самообразование. В Java-мире архитектурные паттерны и алгоритмы — это то, что отличает мидла от сеньора. Не ждите особого случая, забирайте базу прямо сейчас.
Успейте купить курсы Proglib Academy по старой цене до понедельника:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Взять по старой цене
⚠️ Цены вырастут 19 января
❤1
Forwarded from Библиотека задач по Java | тесты, код, задания
Как лучше защититься от SQL инъекции?
Anonymous Quiz
7%
Использовать метод escapeSql() для экранирования пользовательского ввода
5%
Прятать SQL-запросы в отдельные классы и файлы
2%
Ограничить длину вводимых данных пользователем
78%
Использовать PreparedStatement с параметризованными запросами
8%
Посмотреть ответ
😁8👍4🔥3
Наш подписчик спрашивает:
Перешли на Java 21, Virtual Threads зашли отлично. Теперь смотрю на Structured Concurrency API (JEP 462, пока в preview).
У нас классика: один запрос → параллельно дергаем несколько микросервисов → агрегируем ответ. Structured Concurrency пока preview feature. Стоит ли уже переходить или рано?
P.S. Если хотите задать вопрос, заполните нашу гугл-форму. Это займет 5 минут.
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔2❤1🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
💯29😁15👍6❤🔥1
Рефакторишь проект, нужно найти все места, где используется deprecated метод с определённым паттерном вызова. Ctrl+F не поможет — он ищет текст, а не структуру кода. Для этого есть SSR.
🔹 Что это
Structural Search — поиск по AST-дереву кода, а не по тексту. Ищешь паттерны: методы с конкретными параметрами, переменные определённого типа, цепочки вызовов. И сразу заменяешь на новый код.
🔹 Как открыть
— Ctrl+Shift+A → "Structural Search" или "Structural Replace".
— Edit → Find → Search/Replace Structurally.
— Или Ctrl+Shift+F → переключись на вкладку "Structural".
🔹 Готовые шаблоны
IDEA поставляется с десятками шаблонов:
— Existing templates → Java → видишь примеры для логирования, коллекций, исключений.
— Можешь скопировать и доработать под себя.
🔹 Зачем это нужно
— Рефакторинг legacy за минуты вместо часов.
— Находишь bug patterns (например, забытые null-checks).
— Автоматизируешь code review — проверяй стандарты кода.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3👏1
System.out.println(«Final call»)Завтра мы повышаем стоимость всех курсов. Успейте сегодня выделить память под развитие, пока прайс не совершил прыжок.
Выделить ресурсы под профессиональный рост
😁7👍2❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁25👍5💯4
🔧 Ускоряем Spring-приложение: кэш для @PathVariable и @RequestParam
В Spring MVC по умолчанию каждый запрос вызывает полный резолвинг аргументов методов контроллера через рефлексию. Но можно включить кэширование метаданных параметров через spring.mvc.argument-resolvers.cache-size.
Это особенно полезно при высоконагруженных API с большим количеством path/query параметров.
🔹 Что это даёт:
→ Меньше overhead на рефлексию при каждом запросе
→ Заметный прирост производительности на эндпоинтах с 5+ параметрами
→ Особенно эффективно в микросервисах с REST API
🔹Подводные камни:
→ Память займёт немного больше (но обычно незначительно)
→ При очень динамичных контроллерах (runtime-генерация) может потребоваться настройка размера кэша
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise
В Spring MVC по умолчанию каждый запрос вызывает полный резолвинг аргументов методов контроллера через рефлексию. Но можно включить кэширование метаданных параметров через spring.mvc.argument-resolvers.cache-size.
Это особенно полезно при высоконагруженных API с большим количеством path/query параметров.
spring:
mvc:
argument-resolvers:
cache-size: 256
# Включает кэш для резолверов аргументов (PathVariable, RequestParam и т.д.)
# 256 — разумный размер для большинства приложений
🔹 Что это даёт:
→ Меньше overhead на рефлексию при каждом запросе
→ Заметный прирост производительности на эндпоинтах с 5+ параметрами
→ Особенно эффективно в микросервисах с REST API
🔹Подводные камни:
→ Память займёт немного больше (но обычно незначительно)
→ При очень динамичных контроллерах (runtime-генерация) может потребоваться настройка размера кэша
══════ Навигация ══════
Вакансии • Задачи • Собесы
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍6👏1
Forwarded from Библиотека собеса по Java | вопросы с собеседований
При вызове статического метода решение о том, какой метод выполнить, принимается на этапе компиляции по типу ссылки, а не по типу объекта.
class Parent {
static void test() { System.out.println("Parent"); }
}
class Child extends Parent {
static void test() { System.out.println("Child"); }
}
Parent obj = new Child();
obj.test(); // Выведет "Parent"Статические методы принадлежат классу, а не объекту, поэтому
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3🔥2
🔬 Утечка, которую не видит heap dump
Интересная ловушка: вызываешь string.intern() на динамических строках, приложение падает с OOM, делаешь heap dump — а там всё чисто. Где утечка?
🔹 Суть проблемы
String Pool до Java 7 жил в PermGen, с Java 7 переехал в heap. Казалось бы, проблема решена. Но нет.
Внутри String Pool использует нативную хеш-таблицу StringTable, которая живёт в native memory (вне heap). Когда ты делаешь intern(), в heap создаётся сама строка, но ссылка на неё хранится в нативной StringTable.
🔹 Что происходит
Строки попадают в heap (GC их уберёт), но StringTable в native memory растёт бесконечно. Размер StringTable фиксирован и задаётся -XX:StringTableSize. При переполнении — коллизии, деградация, OOM.
🔹 Как увидеть?
Или Native Memory Tracking:
Ищи раздел Symbol — там StringTable.
⚠️ String Pool — это не только heap. StringTable живёт в native memory, и это классическая офф-хип утечка.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#coreJava
Интересная ловушка: вызываешь string.intern() на динамических строках, приложение падает с OOM, делаешь heap dump — а там всё чисто. Где утечка?
🔹 Суть проблемы
String Pool до Java 7 жил в PermGen, с Java 7 переехал в heap. Казалось бы, проблема решена. Но нет.
Внутри String Pool использует нативную хеш-таблицу StringTable, которая живёт в native memory (вне heap). Когда ты делаешь intern(), в heap создаётся сама строка, но ссылка на неё хранится в нативной StringTable.
🔹 Что происходит
Строки попадают в heap (GC их уберёт), но StringTable в native memory растёт бесконечно. Размер StringTable фиксирован и задаётся -XX:StringTableSize. При переполнении — коллизии, деградация, OOM.
🔹 Как увидеть?
bashjcmd <pid> VM.stringtable
Или Native Memory Tracking:
bash-XX:NativeMemoryTracking=detail
jcmd <pid> VM.native_memory
Ищи раздел Symbol — там StringTable.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#coreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥7👏2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁28💯4👍2
🔧 ObjectMapper и timezone: настройка обработки дат без указания зоны
При десериализации дат в формате "2024-01-15T10:00:00" без явной таймзоны Jackson по умолчанию использует UTC. Это может привести к неожиданным результатам при работе с ZonedDateTime или Instant, когда приложение работает в другой временной зоне.
🔵 Решение
▪️ Настройка ObjectMapper через Jackson2ObjectMapperBuilderCustomizer:
Jackson будет использовать системную таймзону приложения вместо UTC. Актуально для микросервисной архитектуры при обмене timestamp'ами между сервисами.
▪️ Для явного указания таймзоны:
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise
При десериализации дат в формате "2024-01-15T10:00:00" без явной таймзоны Jackson по умолчанию использует UTC. Это может привести к неожиданным результатам при работе с ZonedDateTime или Instant, когда приложение работает в другой временной зоне.
▪️ Настройка ObjectMapper через Jackson2ObjectMapperBuilderCustomizer:
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> builder
.timeZone(TimeZone.getDefault())
.featuresToDisable(
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
);
}
Jackson будет использовать системную таймзону приложения вместо UTC. Актуально для микросервисной архитектуры при обмене timestamp'ами между сервисами.
▪️ Для явного указания таймзоны:
java.timeZone(TimeZone.getTimeZone("Europe/Moscow"))══════ Навигация ══════
Вакансии • Задачи • Собесы
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Enterprise AI: внедрение RAG в Java-экосистему
23 января в 19:00 на открытом уроке к курсу «Разработка ИИ агентов» разберём, как научить LLM работать с корпоративными знаниями без утечек и ошибок. Обсудим архитектуры
Спикер — Игорь Стурейко, тимлид в «Газпроме» и AI-архитектор на
На уроке разберём:
— принципы работы
— обзор инструментов для интеграции LLM в промышленный стек;
— работу с векторными индексами (
📅 Когда: 23.01 в 19:00 МСК
Узнать подробности
23 января в 19:00 на открытом уроке к курсу «Разработка ИИ агентов» разберём, как научить LLM работать с корпоративными знаниями без утечек и ошибок. Обсудим архитектуры
RAG и методы Fine-tuning для реализации сложных Enterprise-решений.Спикер — Игорь Стурейко, тимлид в «Газпроме» и AI-архитектор на
Kubernetes. В видеосообщении Игорь делится опытом построения агентных систем и рассказывает, что ждёт студентов на курсе подготовки архитекторов ИИ.На уроке разберём:
— принципы работы
Retrieval-Augmented Generation в закрытом контуре;— обзор инструментов для интеграции LLM в промышленный стек;
— работу с векторными индексами (
FAISS, Chroma) для быстрого поиска.📅 Когда: 23.01 в 19:00 МСК
Узнать подробности
Java Developer — офис (Новосибирск)
Java Developer — 230 000 — 240 000 ₽ — удалёнка
Java Developer — гибрид (Алматы)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥1😁1
Блокировки — способ контролировать одновременный доступ к данным. Два подхода: пессимистичный (блокируем заранее) и оптимистичный (проверяем при сохранении).
Простыми словами: пессимист говорит "займи очередь до конца", оптимист — "иди делай, потом проверим, не опередил ли кто-то".
🔹 Ключевые моменты
▪️ Pessimistic Lock — блокирует запись в БД на время транзакции (SELECT FOR UPDATE).
▪️ Optimistic Lock — проверяет версию при UPDATE, если изменилась — бросает исключение.
▪️ Пессимистичный подход безопаснее, но медленнее и может создавать deadlock'и.
▪️ Оптимистичный быстрее, но требует обработки конфликтов в коде.
▪️ В JPA: @Lock(PESSIMISTIC_WRITE) vs @Version.
🔹 Подводные камни
— Pessimistic lock держит соединение с БД — при долгих операциях можно исчерпать connection pool.
— Deadlock'и при неправильном порядке блокировок разных таблиц.
— Optimistic lock требует retry-логики на уровне приложения.
— @Version не работает с native queries — только через JPQL/Criteria.
— В высоконагруженных системах оптимистичные блокировки могут давать слишком много конфликтов.
— Операции с деньгами, где конфликт недопустим.
— Высокая вероятность конкурентного доступа к одной записи.
— Критичные бизнес-процессы (бронирование последнего товара).
— Короткие транзакции с гарантией успеха.
— Низкая вероятность конфликтов (разные пользователи редко трогают одну запись).
— Долгие транзакции или работа через UI (пользователь открыл форму, долго думает).
— Микросервисная архитектура — меньше нагрузка на БД.
— Batch-операции, где можно переобработать failed записи.
🔧 Бонус-трюк: комбинируйте подходы. Например, optimistic lock для UI-операций (пользователь редактирует профиль) + pessimistic для критичных API endpoints (списание средств). В одном приложении могут жить оба паттерна.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4👏1