Забудьте про System.out.println() в логике — используйте Evaluate Expression прямо во время отладки, чтобы проверить любые значения на лету.
— Позволяет выполнять произвольные выражения прямо во время паузы
— Работает с контекстом текущего стека: переменные, поля, this
— Поддерживает сложные конструкции: myList.stream().filter(...).collect(...)
— Позволяет быстро проверять гипотезы при отладке
— Избавляет от лишних логов или временных переменных
— Помогает исследовать поведение без изменения кода
— Поставьте breakpoint и запустите Debug
— Когда выполнение остановится, нажмите Alt + F8
— Введите выражение и нажмите Evaluate
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍12🔥5
🐘 Hibernate ORM — зрелый ORM-фреймворк для Java, который остается стандартом де-факто для работы с реляционными БД. Хотя проект реализует JPA-спецификацию, он предлагает гораздо больше возможностей — от расширенного кэширования до поддержки экзотических СУБД вроде SAP HANA.
Разработчики уделяют внимание тестированию: в комплекте идут Docker-скрипты для быстрого развертывания 15+ СУБД и гибкая система профилей. Сборка требует JDK 21, но сохраняет совместимость с Java 17.
🖥 GitHub
✅ Java библиотека #java
Разработчики уделяют внимание тестированию: в комплекте идут Docker-скрипты для быстрого развертывания 15+ СУБД и гибкая система профилей. Сборка требует JDK 21, но сохраняет совместимость с Java 17.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍5🔥2
Нужно отслеживать, кто что сделал в приложении: создал пользователя, обновил заказ или удалил файл? Реализуйте модуль аудита, который не просто логирует в консоль, а сохраняет структурированные события в базу или брокер. AI поможет с шаблоном, который можно встроить в любой микросервис.
📝 Промпт:
Generate a reusable audit logging module for a Spring Boot 3 application.
— Use Spring AOP to intercept service-layer methods annotated with @Auditable.
— Capture method name, parameters, execution time, and authenticated user details.
— Log audit events asynchronously to Kafka with a custom AuditEvent structure.
— Use JSON for message serialization and include correlation IDs in headers.
— Include fallback to local file logging in case of Kafka failure.
— Add integration with Spring Security to extract user identity from the context.
— Write unit and integration tests using JUnit 5 and Testcontainers.
— Добавьте
Implement audit event persistence to PostgreSQL using Spring Data JPA, чтобы хранить критические события даже при сбоях брокера.— Добавьте
Include context metadata (request IP, user-agent) using ServletRequest attributes, чтобы повысить трассируемость действий пользователя.— Добавьте
Add audit dashboard using Spring Boot Admin and Grafana, чтобы визуализировать действия и аномалии в реальном времени.— Добавьте
Integrate OpenTelemetry spans around auditing logic, чтобы отслеживать поток аудита между микросервисами на уровне трассировки.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤3👍2
Интегрируется через командную строку или Maven-плагин. Особенно полезен при диагностике проблем в продакшн-средах, где традиционные профайлеры могут быть слишком тяжелыми.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥5❤4
❓Java Guru - вопросы и задачи с собеседований. Канал с помощью которого ты точно получишь оффер!
👩💻 Android Developer - канал для андроид разработчиков! Статьи, вопросы и задачи с собеседований, лайфхаки.
👩💻 Kotlin Developer - самый топовый канал для котлин разработчика!
📕 Книги для Java программиста - канал с книгами по Java. Постоянно выходят новинки как на русском так и на английском языке!
📰 Java News - канал с последними новостями из мира Java!
📕 Книги для Java программиста - канал с книгами по Java. Постоянно выходят новинки как на русском так и на английском языке!
📰 Java News - канал с последними новостями из мира Java!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1
Правильное понимание Liskov Substitution Principle (LSP)
Принципе подстановки Лискова нередко трактуют слишком формально или упрощенно. Простой ответ: LSP требует, чтобы объекты подклассов могли заменять объекты базового класса без изменения поведения программы.
Однако, давайте разберем это более подробно.
🟢 Что на самом деле означает LSP?
В классическом виде (по Барбаре Лисков):
Это значит, что любой класс-наследник должен вести себя так же, как и его родитель, не нарушая логики работы программы. Программа должна продолжать работать корректно, если один объект заменяется другим, даже если их реализации отличаются.
🟢 Часто встречаемые ошибки трактования LSP
1. Подмена функционала
Проблемы могут возникнуть, если подкласс значительно меняет поведение метода родительского класса. Например, если метод в подклассе требует дополнительных условий или приводит к ошибкам, это нарушает принцип.
❌ Плохо:
Этот пример нарушает LSP, потому что подкласс не может выполнять все действия родителя.
2. Нарушение инвариантов
Если подкласс добавляет новые ограничения или меняет условия, которые предполагались в родительском классе, это может привести к неожиданным результатам. Например, если родительский класс предполагает, что его методы могут работать в определённых диапазонах значений, а в подклассе эти значения не допустимы, это также нарушает принцип.
❌ Плохо:
В этом примере подкласс Square изменяет логику работы с размерами, нарушая ожидаемое поведение родительского класса.
🟢 Что на практике важно понимать о LSP
— Соблюдение контракта родительского класса
Подклассы должны соблюдать контракт родительского класса, а не изменять его. Это означает, что если родительский класс предполагает выполнение определённых операций, подкласс не должен их нарушать.
— Логика не должны быть нарушена, лишь расширена
Подклассы должны только дополнять, а не изменять поведение родительского класса. Это должно обеспечивать предсказуемость программы.
— Наследование — это не просто копирование, а расширение возможностей
Правильное наследование позволяет создавать более специфичные классы без нарушения логики родительского класса.
✅ Java библиотека #java
Принципе подстановки Лискова нередко трактуют слишком формально или упрощенно. Простой ответ: LSP требует, чтобы объекты подклассов могли заменять объекты базового класса без изменения поведения программы.
Однако, давайте разберем это более подробно.
В классическом виде (по Барбаре Лисков):
Объекты программы должны быть заменяемы экземплярами их подтипов без изменения правильности работы программы.
Это значит, что любой класс-наследник должен вести себя так же, как и его родитель, не нарушая логики работы программы. Программа должна продолжать работать корректно, если один объект заменяется другим, даже если их реализации отличаются.
1. Подмена функционала
Проблемы могут возникнуть, если подкласс значительно меняет поведение метода родительского класса. Например, если метод в подклассе требует дополнительных условий или приводит к ошибкам, это нарушает принцип.
class Bird {
void fly() { ... }
}
class Chicken extends Bird {
@Override
void fly() {
throw new UnsupportedOperationException("Chicken can't fly");
}
}Этот пример нарушает LSP, потому что подкласс не может выполнять все действия родителя.
2. Нарушение инвариантов
Если подкласс добавляет новые ограничения или меняет условия, которые предполагались в родительском классе, это может привести к неожиданным результатам. Например, если родительский класс предполагает, что его методы могут работать в определённых диапазонах значений, а в подклассе эти значения не допустимы, это также нарушает принцип.
class Rectangle {
int width, height;
void setWidth(int width) { this.width = width; }
void setHeight(int height) { this.height = height; }
}
class Square extends Rectangle {
@Override
void setWidth(int width) {
this.width = this.height = width;
}
@Override
void setHeight(int height) {
this.height = this.width = height;
}
}В этом примере подкласс Square изменяет логику работы с размерами, нарушая ожидаемое поведение родительского класса.
— Соблюдение контракта родительского класса
Подклассы должны соблюдать контракт родительского класса, а не изменять его. Это означает, что если родительский класс предполагает выполнение определённых операций, подкласс не должен их нарушать.
— Логика не должны быть нарушена, лишь расширена
Подклассы должны только дополнять, а не изменять поведение родительского класса. Это должно обеспечивать предсказуемость программы.
— Наследование — это не просто копирование, а расширение возможностей
Правильное наследование позволяет создавать более специфичные классы без нарушения логики родительского класса.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍10🔥5
Инструмент имеет встроенный онлайн-редактор для тестирования правил прямо в браузере. Интегрируется с Spring Boot и работает с разными хранилищами политик, включая базы данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4❤3
Случайно удалили строки, или вдруг не можете вспомнить, что только что меняли? Здесь на помощь приходит Local History.
— Хранит локальные изменения файлов даже без коммитов
— Сохраняет историю редактирования на уровне IDE
— Позволяет вернуться к любой версии файла за определенный период времени
— Спасает, если случайно удалил важные строки или сделал нежелательное изменение
— Не требует настроек или использования системы контроля версий
— Мгновенно восстанавливает состояние файла без лишних усилий
— Щелкните правой кнопкой на файле, выберите Local History -> Show History
— Выберите нужную версию и восстановите изменения
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥9👍4
ArnoldC — это императивный язык программирования, где основные конструкции заменяются известными фразами из фильмов Арнольда Шварценеггера.
- if → BECAUSE I'M GOING TO SAY PLEASE
- while → STICK AROUND
- return → I'LL BE BACK
- LISTEN TO ME VERY CAREFULLY name — объявление метода
- I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE — аргументы
- GIVE THESE PEOPLE AIR — non-void метод
Код компилируется в Java, работает на JVM — это не просто шутка. Язык стабилен, есть примеры и документация.
HASTA LA VISTA, BABY
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9😁6👍4❤3
Media is too big
VIEW IN TELEGRAM
TCP Log-сервер на java (NIO)
В предыдущем видео Оптимизация неблокирующего TCP сервера на java (NIO) был оптимизирован TCP сервер.
Сейчас на его основе сделаем сервер для приема логов.
Для парсинга потока байт применим конечный автомат.
🌐 🗣 СМОТРЕТЬ VKVIDEO
📺 🗣 СМОТРЕТЬ RUTUBE
✅ Java библиотека #java
В предыдущем видео Оптимизация неблокирующего TCP сервера на java (NIO) был оптимизирован TCP сервер.
Сейчас на его основе сделаем сервер для приема логов.
Для парсинга потока байт применим конечный автомат.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2🔥2🍾2
Хотите создать мощный инструмент мониторинга для ваших микросервисов? Используйте AI, чтобы автоматически генерировать код для сбора метрик, логирования и трассировки запросов в реальном времени. Это поможет эффективно отслеживать производительность и устранять узкие места в системе.
📝 Промпт:
Generate a monitoring system for microservices in a Spring Boot 3 application.
— Integrate Spring Actuator to expose application health metrics and endpoints.
— Use Micrometer for collecting metrics such as response time, request count, and error rates.
— Implement distributed tracing with OpenTelemetry and Zipkin for tracking requests across multiple services.
— Enable log aggregation with ELK Stack (Elasticsearch, Logstash, and Kibana) for centralized log management.
— Set up Prometheus and Grafana for visualizing real-time performance metrics on custom dashboards.
— Configure automatic health checks and alerting using Spring Boot Admin and Prometheus Alerts.
— Create custom metrics to track domain-specific application performance, such as user sign-ups or payment processing times.
— Добавьте
Integrate application performance profiling using JProfiler для захвата и анализа подробных данных о производительности.— Добавьте
Set up integration with Datadog or New Relic для получения дополнительных аналитических данных и обнаружения аномалий в приложении.— Добавьте
Implement circuit breaker patterns with Resilience4j для повышения стабильности системы при высоком трафике или сбоях сервисов.— Добавьте
Enable traceability for all API calls with correlation IDs для обеспечения сквозной трассировки запросов в распределенной системе.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥2
Проект предоставляет Java-обёртки для популярных C/C++ библиотек вроде OpenCV, FFmpeg и libdc1394, позволяя использовать их возможности без необходимости писать нативный код.
Инструмент имеет встроенные утилиты для калибровки камер, обнаружения объектов и работы с GPU через OpenCL/OpenGL. Поддерживается интеграция с аппаратными SDK. Установка возможна через Maven/Gradle или вручную.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🔥3🎅1
Forwarded from Java Guru 🤓
👍7🔥5😁5❤3
Как подключить Apache Kafka к проекту
Apache Kafka — это распределённая система обработки потоковых данных, которая часто используется для обработки больших объёмов сообщений в реальном времени. В этом посте мы разберём пошаговое подключение Kafka к проекту.
1️⃣ Подготовка
Для начала вам нужно добавить зависимости.
Убедитесь, что у вас установлен Apache Kafka и Zookeeper, или используйте сервисы, такие как Confluent Cloud.
2️⃣ Настройка KafkaProducer
KafkaProducer используется для отправки сообщений в Kafka. Вот пример создания продюсера, который будет отправлять сообщения в топик Kafka.
Шаг 1. Создайте конфигурацию продюсера:
Шаг 2. Отправка сообщения:
3️⃣ Настройка KafkaConsumer
Шаг 1. Создайте конфигурацию консюмера:
Шаг 2. Чтение сообщений:
4️⃣ Запуск Kafka Producer и Consumer
Запустите сервер Kafka и Zookeeper (если используете локальную установку).
🔘 Включите продюсер:
🔘 Запустите консюмер для получения сообщений:
Как вы используете Kafka в своих проектах?
✅ Java библиотека #java
Apache Kafka — это распределённая система обработки потоковых данных, которая часто используется для обработки больших объёмов сообщений в реальном времени. В этом посте мы разберём пошаговое подключение Kafka к проекту.
Для начала вам нужно добавить зависимости.
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.0.0</version>
</dependency>
ИЛИ
implementation 'org.apache.kafka:kafka-clients:3.0.0'
Убедитесь, что у вас установлен Apache Kafka и Zookeeper, или используйте сервисы, такие как Confluent Cloud.
KafkaProducer используется для отправки сообщений в Kafka. Вот пример создания продюсера, который будет отправлять сообщения в топик Kafka.
Шаг 1. Создайте конфигурацию продюсера:
public class KafkaProducerConfig {
public KafkaProducer<String, String> createProducer() {
Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
return new KafkaProducer<>(properties);
}
}Шаг 2. Отправка сообщения:
public class KafkaMessageSender {
public void sendMessage(String topic, String message) {
KafkaProducer<String, String> producer = new KafkaProducerConfig().createProducer();
ProducerRecord<String, String> record = new ProducerRecord<>(topic, message);
try {
producer.send(record, (metadata, exception) -> {
if (exception != null) {
exception.printStackTrace();
} else {
System.out.println("Сообщение отправлено в " + metadata.topic());
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.close();
}
}
}Шаг 1. Создайте конфигурацию консюмера:
public class KafkaConsumerConfig {
public KafkaConsumer<String, String> createConsumer() {
Properties properties = new Properties();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "consumer-group");
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
return new KafkaConsumer<>(properties);
}
}Шаг 2. Чтение сообщений:
public class KafkaMessageReceiver {
public void receiveMessages(String topic) {
KafkaConsumer<String, String> consumer = new KafkaConsumerConfig().createConsumer();
consumer.subscribe(Arrays.asList(topic));
try {
while (true) {
var records = consumer.poll(1000);
for (ConsumerRecord<String, String> record : records) {
System.out.println("Получено сообщение: " + record.value());
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
consumer.close();
}
}
}Запустите сервер Kafka и Zookeeper (если используете локальную установку).
public class Main {
public static void main(String[] args) {
KafkaMessageSender sender = new KafkaMessageSender();
sender.sendMessage("my_topic", "Привет, Kafka!");
}
}public class Main {
public static void main(String[] args) {
KafkaMessageReceiver receiver = new KafkaMessageReceiver();
receiver.receiveMessages("my_topic");
}
}Как вы используете Kafka в своих проектах?
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡15❤6🔥2
Java 21 представила новый способ работы со строками — *string templates*. Это функция-превью (preview), которую нужно включать явно (
--enable-preview) и использовать с JDK 21 или 22. В Java 23 от неё отказались, чтобы переработать дизайн. Как это работает?
- Используется шаблонный процессор, например
STR.- Сразу после него идёт точка
. и строка-шаблон с выражениями внутри \{...}:String name = "Duke";
String greeting = STR."My name is \{name}";
// -> "My name is Duke"
Встроенные выражения могут быть любыми Java-выражениями: арифметика, методы, поля:
int x = 10, y = 20;
String result = STR."\{x} + \{y} = \{x + y}";
- Поддержка многострочных шаблонов
Можно использовать текстовые блоки для JSON, SQL и других структур:
String json = STR."""
{
"user": "\{name}",
"temp": \{tempC}
}
""";
Технические детали
Шаблоны создают объект StringTemplate (runtime представление), содержащий массив литералов и значений выражений.
- Есть разные шаблонные процессоры:
- STR — стандартная интерполяция
- FMT — поддерживает форматирование и локаль
- RAW — необработанный шаблон, для кастомной обработки
Текущее состояние
- Java 21: функция доступна как preview (JEP 430)
- Java 22: вторая preview-итерация
- Java 23: удалена (даже как preview), дизайн требует доработки
Почему удалили?
- Жалобы на синтаксис — \{} вместо привычного ${}, processor.template вместо простого подхода
- Смешение capture (формирование шаблона) и processing нарушает удобство расширения
- Производительность можно обеспечить и без специального синтаксиса
- Дискуссия среди разработчиков: часть считает interpolation небезопасной/бесполезной, часть — нужной функцией качества жизни
Итог
Java 21 попыталась упростить работу со строками и структурными текстами с помощью string templates — но разработка приостановлена из-за критики синтаксиса и архитектуры. Пока функция нестабильна и требует пересмотра.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍6🔥5
Forwarded from Java Guru 🤓
Что делает данный конфигурационный класс?
Anonymous Quiz
2%
Отключает аутентификацию для всех запросов
3%
Применяет форму входа для всех запросов
92%
Разрешает доступ без аутентификации к /public/** и требует аутентификацию для остальных запросов
2%
Разрешает доступ без аутентификации только к /
1%
Включает аутентификацию только для POST-запросов
👍8🔥4
JOL — это инструмент от тех же разработчиков, что и JMH, и он помогает понять, как Java хранит объекты в памяти. Особенно полезен при оптимизации производительности и снижении потребления памяти.
📌 Что умеет JOL:
— Показывает внутреннюю структуру объектов Java (поля, пэддинг, смещения)
— Помогает исследовать выравнивание, заполнение и особенности layout'а объектов в разных JVM
— Учитывает влияние флагов типа -XX:ObjectAlignmentInBytes
— Есть аннотации и API для анализа объектов прямо из кода
— Поддерживает анализ "на месте" без запуска внешнего инструмента
🧠 Особенно актуально, если вы работаете с большим количеством данных, кастомными структурами или high-load системами. Понимание того, что реально занимает память, помогает сократить её расход без магии.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍2🔥2
Библиотека кроссплатформенная, поддерживает синтаксис ANSI, Unicode и даже интеграцию с SSH/Telnet. Минимальная требуемая версия Java — 11, а для проектов на JPMS есть готовые модули. Подключить инструмент просто: достаточно добавить зависимость в Maven или Gradle.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4🔥3
Когда проект обрастает модулями, библиотеками и зависимостями, легко потерять нить. Dependency Analyzer помогает навести порядок в зависимостях и избавить проект от хлама.
— Показывает все зависимости (включая транзитивные) в виде дерева
— Помогает обнаружить дублирующиеся зависимости, неиспользуемые библиотеки и конфликты версий
— Даёт рекомендации по удалению или замене
— Упрощает анализ pom.xml или build.gradle — не нужно гадать, откуда взялась та или иная версия
— Помогает оптимизировать сборку и ускорить CI
— Снижает риски уязвимостей за счёт удаления неиспользуемых библиотек
— Откройте окно Maven/Gradle
— Нажмите кнопку Analyze Dependencies.
— IDEA покажет дерево с путями, версиями и проблемами
— Можно быстро перейти к конфигурации и исправить
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤8🔥5😁1